C 计算阶乘(n)%m的递归方法中的分段错误
我正在尝试计算C 计算阶乘(n)%m的递归方法中的分段错误,c,recursion,factorial,C,Recursion,Factorial,我正在尝试计算n!%m在C中使用递归。这是我正在使用的 #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
n!%m
在C
中使用递归。这是我正在使用的
#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));
}
那么,为什么迭代方法有效,而递归方法却失败了呢?试试gdb,但很可能是因为您正在达到最大递归深度,换句话说,无论是字面上还是基于操作系统的当前规则集,“内存”都已用完。试试gdb,但很可能是因为您正在达到最大递归深度,换句话说,无论是字面上还是基于操作系统的当前规则集,“内存”都将耗尽。如果您的C编译器优化尾部调用,您可以将递归函数重写为尾部递归函数:
long long int fact_aux(long long int n, long long int acc) {
if(n <= 1)
return acc;
return fact_aux(n-1, (n * acc)%m);
}
long long int fact(long long int n) {
return fact_aux(n, 1);
}
long-long-int-fact\u-aux(long-long-int-n,long-long-int-acc){
如果(n如果您的C编译器优化了尾部调用,您可以将递归函数重写为尾部递归函数:
long long int fact_aux(long long int n, long long int acc) {
if(n <= 1)
return acc;
return fact_aux(n-1, (n * acc)%m);
}
long long int fact(long long int n) {
return fact_aux(n, 1);
}
long-long-int-fact\u-aux(long-long-int-n,long-long-int-acc){
如果(n看起来您正在溢出调用堆栈。尝试执行ulimit-s unlimited
以增加堆栈大小。调用堆栈的最大高度小于long long int i
的最大值。看起来您正在溢出调用堆栈。尝试执行ulimit-s unlimited
以增加堆栈大小。调用堆栈的最大高度小于long int i
的最大值。