【发布时间】:2014-10-30 22:18:41
【问题描述】:
我正在尝试使用C 中的递归计算n! % m。这是我正在使用的code
#include<stdio.h>
#define m 1000000007
long long int fact(long long int n) {
if(n == 1)
return (1);
long long int n2 = (long long int)(fact(n-1));
long long int k = (n*n2)%m;
return k;
}
int main() {
printf("%lld",fact(1000000));
}
这个程序给出 SEGMENTATION FAULT ,但是如果我用迭代方法替换 fact 函数,那么程序会打印正确的答案。迭代 fact 函数是
long long int fact(long long int n){
long long int k =1;
long long int i;
for(i = n;i>1;i--)
k = (k*i)%m;
return k;
}
那么为什么迭代方法有效但递归方法失败了?
【问题讨论】:
-
看起来你正在溢出调用堆栈。尝试使用
ulimit -s unlimited来增加堆栈大小。 -
你的调用栈的最大高度小于你的
long long int i的最大值。