h********g 发帖数: 496 | 1 如下。本来想算算尾递归和递归的性能区别。结果发现iterative的算法都不行。
每步的结果都%777,就是为了防止结果溢出。
#include
using namespace std;
int factor(int n){
if(n==0) return 1;
int acc=1;
for(int i=n; i>0; i--)
acc=acc*i%777;
return acc;
}
int factor_recursive(int n){
if(n==1 || n==0) return 1;
return factor_recursive(n-1)*n%777;
}
//g++ doesn't optimize for tail-recursion. The following function stops at
Factor(37).
int factor_tailrecursive(int n, int acc){
if(n==1 || n==0) return acc;
return factor_tailrecursive(n-1, (acc*n)%777);
}
int main(){
int n;
cin>>n;
//cout<
//cout<
cout<
return 0;
} |
t****t 发帖数: 387 | 2 (37 * 36 % 777 )* 35 % 777 = 0
为啥会有溢出 |
h********g 发帖数: 496 | 3 我搞错了,惭愧。
【在 t****t 的大作中提到】 : (37 * 36 % 777 )* 35 % 777 = 0 : 为啥会有溢出
|
p*****2 发帖数: 21240 | |
h********g 发帖数: 496 | 5 g++对尾递归没有优化。尾递归和递归同时 segmentation fault
iteration的没有问题。
【在 p*****2 的大作中提到】 : 有什么结论吗?
|
h********g 发帖数: 496 | 6 当然以上代码中的注释是错的。实际n达到8位数往上才开始出错,而不是37.
【在 h********g 的大作中提到】 : g++对尾递归没有优化。尾递归和递归同时 segmentation fault : iteration的没有问题。
|
p*****2 发帖数: 21240 | 7
为什么要测C++呢?
【在 h********g 的大作中提到】 : 当然以上代码中的注释是错的。实际n达到8位数往上才开始出错,而不是37.
|
h********g 发帖数: 496 | 8 因为我不用fp,呵呵。
【在 p*****2 的大作中提到】 : : 为什么要测C++呢?
|
p*****2 发帖数: 21240 | 9
那为什么对尾递归感兴趣呢?按说C++也应该不会有优化呀。
【在 h********g 的大作中提到】 : 因为我不用fp,呵呵。
|
h********g 发帖数: 496 | 10 你满版的鼓吹,我就试验一小下呗
【在 p*****2 的大作中提到】 : : 那为什么对尾递归感兴趣呢?按说C++也应该不会有优化呀。
|