Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 计算阶乘(n)%m的递归方法中的分段错误_C_Recursion_Factorial - Fatal编程技术网

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
的最大值。