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

递归函数在哪里终止?结合C语言阶乘递归代码的疑问

递归阶乘逻辑答疑

你提供的代码如下:

#include <stdio.h>

int factorial(int n);
void main()
{
    int n;
    printf("Enter your number : " );
    scanf("%d",&n);
    if(n <= 1)
    {
        printf("The factorial of the number n is ",n);
    }
    else
    {
        int res = factorial(n);
        printf("The result is %d\n",res);
    }
}
int factorial(int n)
{
    if(n <= 1)
        return 1;
    return n * factorial(n-1);
}

你的疑惑核心是对函数分支执行逻辑的误解,递归不会走到n=-1的原因很简单:只要if(n <= 1)的判断条件成立,函数就会直接执行return 1语句终止,后续的return n * factorial(n-1)代码完全不会运行,自然不会继续调用参数更小的factorial。就算你主动传入n=0调用factorial,同样会直接命中终止条件返回1,不会触发后续递归调用,不可能出现n=-1、-2的情况。

我们拿你测试的输入5举例,完整的调用栈流程如下:

  • 第一步:调用factorial(5),n=5不满足n<=1,执行后续逻辑,计算5 * factorial(4),触发factorial(4)调用
  • 第二步:调用factorial(4),n=4不满足终止条件,计算4 * factorial(3),触发factorial(3)调用
  • 第三步:调用factorial(3),n=3不满足终止条件,计算3 * factorial(2),触发factorial(2)调用
  • 第四步:调用factorial(2),n=2不满足终止条件,计算2 * factorial(1),触发factorial(1)调用
  • 第五步:调用factorial(1),n=1满足n<=1,直接返回1,没有后续递归调用,递归链在此处完全终止

之后就会反向计算结果:2*1=2 → 3*2=6 → 4*6=24 → 5*24=120,最后把120返回给main函数输出。

另外补充两个你代码里的小问题:

  • main函数的标准写法是int main(void),执行结束需要return 0,void main()是部分编译器支持的非标准写法
  • 你n<=1分支的printf语句漏了占位符,应该改成printf("The factorial of the number %d is 1\n",n);,否则输入1的时候输出格式是错误的

内容的提问来源于stack exchange,提问作者Aryan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 17:57:04