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

C程序输出00246不符合逻辑预期,求原因解析

递归代码输出00246的原因分析

你提供的C代码如下:

int print(int nb)
{
    if (nb < 0) 
    {
        return (0);
    }
    printf("%d", nb + print(nb - 1));
    nb --;
    return (nb);
}

int main(void)
{
    print(4);
    return (0);
}

要理解输出00246的原因,核心是搞清楚递归的执行顺序:递归函数会先不断调用自身直到触发终止条件,再从最底层的递归调用开始回溯执行后续代码。我们一步步拆解执行流程:

  1. 初始调用print(4),进入函数后先执行printf("%d", 4 + print(3)),因此优先调用print(3)
  2. print(3)执行printf("%d", 3 + print(2)),调用print(2)
  3. print(2)执行printf("%d", 2 + print(1)),调用print(1)
  4. print(1)执行printf("%d", 1 + print(0)),调用print(0)
  5. print(0)执行printf("%d", 0 + print(-1)),调用print(-1)
  6. print(-1)触发if (nb < 0)条件,直接返回0

现在开始回溯执行每个printf和后续代码:

  • 回到print(0):计算0 + print(-1) = 0+0=0,输出第一个0;执行nb--(nb变为-1),返回-1
  • 回到print(1):计算1 + print(0) =1 + (-1)=0,输出第二个0;执行nb--(nb变为0),返回0
  • 回到print(2):计算2 + print(1)=2+0=2,输出2;执行nb--(nb变为1),返回1
  • 回到print(3):计算3 + print(2)=3+1=4,输出4;执行nb--(nb变为2),返回2
  • 回到print(4):计算4 + print(3)=4+2=6,输出6;执行nb--(nb变为3),返回3

把所有输出按顺序拼接,就是00246。开头的两个0是递归回溯阶段print(0)和print(1)的printf计算结果,和你直觉逻辑的差异,本质是没理清递归"先深入、后回溯"的执行顺序。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 07:05:17