递归函数引发Segmentation Fault问题求助:C与Python差异及解决方法
问题原因与解决办法
原因分析
你的C语言递归函数没有终止条件,会无限调用自身:
- 调用
factorial(4)时,会依次触发factorial(3)、factorial(2)、factorial(1)、factorial(0)、factorial(-1)……这个调用链永远不会停止。 - 每次递归调用都会在程序栈上分配新的函数栈帧,而栈的内存空间是有限的,当栈被彻底耗尽时,就会触发Segmentation Fault(段错误)。
至于Python版本看似能运行的原因:Python内置了递归深度限制(默认约1000层),超过限制后会抛出RecursionError异常,而非直接触发段错误,但本质上你的Python代码逻辑同样存在错误,只是报错形式不同。
解决办法
给递归函数添加终止条件:数学上0!和1!的结果都是1,因此当x <= 1时直接返回1,修改后的代码如下:
#include <stdio.h> int factorial( int x ); int main(){ printf("%d\n", factorial(4)); // 可添加打印查看计算结果 return 0; } int factorial( int x ){ if (x <= 1) { return 1; } return x * factorial(x-1); }
修改后递归到x=1时就会停止调用链,开始逐层返回计算结果,最终得到正确的阶乘值。
内容的提问来源于stack exchange,提问作者Paroz
相关产品推荐
相关产品推荐

