You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

递归实现阶乘遇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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:46:34