递归实现阶乘遇Segmentation fault:输入正整数时出错求助
问题排查:阶乘递归触发Segmentation Fault的原因
嘿,这问题一眼就能看出来——你的递归调用陷入无限循环了,直接把栈空间耗干,所以触发了段错误!
咱们来拆解下问题根源:
- 当输入正整数
n时,factorial(n)执行的是return n * factorial(n);——你传入的参数还是n,完全没让数值递减! - 递归函数的核心是要有终止条件,你的代码里终止条件是
n==0返回1,但如果每次调用都传同一个n,永远到不了这个终止条件,函数会不停地在栈上创建新的调用帧,直到栈内存被耗尽,系统就会抛出Segmentation fault。 - 而输入-1或0时,直接命中了
n<0或n==0的分支,根本不会进入递归调用,所以程序能正常返回结果。
修正后的代码
把递归调用的参数改成n-1就搞定了:
#include <stdio.h> int factorial(int n){ if (n<0) { return 0; } else if (n==0) { return 1; } else { return n * factorial(n-1); // 这里改成n-1! } } int main(void){ int n = 0; printf("Put n value : "); scanf("%d", &n); printf("%d! = %d\n", n, factorial(n)); return 0; }
额外提个小建议:如果输入的正整数太大,int类型会溢出(比如13!就超过了32位int的最大值),你可以考虑用long long类型来存储计算结果哦。
内容的提问来源于stack exchange,提问作者AxMa
相关产品推荐
相关产品推荐

