C中的阶乘递归(分段错误)

C中的阶乘递归(分段错误),c,recursion,segmentation-fault,factorial,C,Recursion,Segmentation Fault,Factorial,大家好,我是一个初学者,我的递归代码在计算一个数字的阶乘时遇到了问题 我犯了分割错误,我不知道为什么会这样 任何帮助都将不胜感激:) (例如,在我的代码中,我试图计算4的阶乘) #包括 整数阶乘(整数i){ int result=i*阶乘(i-1); 返回结果; } int main() { int结果=阶乘(4); printf(“结果为%d”,结果); } 问题是,您缺少基本条件。因此,您的函数将永远运行,直到它使用程序可用的所有内存,并最终放弃给出分段错误 在编写递归函数时,您

大家好,我是一个初学者,我的递归代码在计算一个数字的阶乘时遇到了问题

我犯了分割错误,我不知道为什么会这样

任何帮助都将不胜感激:)

(例如,在我的代码中,我试图计算4的阶乘)

#包括
整数阶乘(整数i){
int result=i*阶乘(i-1);
返回结果;
}
int main()
{   
int结果=阶乘(4);
printf(“结果为%d”,结果);
}   

问题是,您缺少基本条件。因此,您的函数将永远运行,直到它使用程序可用的所有内存,并最终放弃给出分段错误

在编写递归函数时,您必须始终提供一个基本条件来停止递归。在你的情况下是这样的

if(i == 0)
    return 1;

这里您基本上是说,当i变为0时停止递归。

递归何时结束?当i==0时,递归函数是否自行终止并返回到主函数?对于要返回到主函数的方法,您必须告诉何时返回?试着把它想清楚。在您的情况下,您将无限期地调用
阶乘
方法。你从来没有说过什么时候停下来,这就是问题所在。基本条件告诉递归函数何时停止。另一个注意事项:递归函数不会直接返回到主函数,而是返回到位于调用堆栈顶部的函数。当所有递归函数都返回并从调用堆栈中删除时,只有它会转到主函数。@JomHo当
i
为零时,行
int result=i*factorial(i-1)
int结果=0*阶乘(-1)哪个调用
factorial(-1)
哪个调用
factorial(-2)
哪个调用
factorial(-3)
,依此类推。当函数被无限次调用时,这会导致堆栈溢出。@JomHo否,-1为什么会导致崩溃?崩溃是因为函数被无限调用时堆栈溢出。无效读取几乎没有误导性,当程序试图访问不允许访问的内存区域时,会出现分段错误。由于递归方法占用了所有内存,因此没有内存可供程序使用。因此,一旦您进行下一次递归调用(因为您从未停止),您将得到此错误。这可能会有帮助
if(i == 0)
    return 1;