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

C语言递归函数输出疑惑:为何结果是1234554321而非123455?

为什么这个递归函数会先输出递增数字再输出递减数字?

我来给你掰扯清楚这个递归的执行过程,保证你一看就懂!

先把你贴的代码再放一遍方便对照:

void Count(int cnt){
    printf("%d\n", cnt);
    if(cnt < 5){
        Count(cnt + 1);
    }
    printf("%d\n", cnt);
}
int main(){
    Count(1);
}

你之前以为只会输出1 2 3 4 5 5,是因为没搞明白递归的「递」和「归」两个阶段,咱们一步步模拟执行过程,你就能秒懂:

  • 当main调用Count(1)时:
    1. 先执行第一个printf,输出1
    2. 检查1 < 5成立,于是调用Count(2)——这就是「递」的开始,咱们钻进下一层函数了
  • 进入Count(2):
    1. 先执行第一个printf,输出2
    2. 检查2 <5成立,调用Count(3),继续递
  • 进入Count(3):
    1. 第一个printf输出3
    2. 检查3<5成立,调用Count(4)
  • 进入Count(4):
    1. 第一个printf输出4
    2. 检查4<5成立,调用Count(5)
  • 进入Count(5):
    1. 第一个printf输出5
    2. 检查5<5?不成立!所以跳过递归调用,现在终于到了「归」的阶段
    3. 执行第二个printf,输出5——这是第一个归阶段的输出
  • 现在回到Count(4)的递归调用之后(也就是Count(5)执行完了):
    执行Count(4)的第二个printf,输出4
  • 回到Count(3)的递归调用之后:
    执行第二个printf,输出3
  • 回到Count(2)的递归调用之后:
    执行第二个printf,输出2
  • 回到最开始的Count(1)的递归调用之后:
    执行第二个printf,输出1

说白了,递归就像玩套娃:你得先把最外面的娃打开,再打开里面的,一层一层到最核心(这是「递」,对应每个函数里的第一个printf);等核心看完了,你得再一层一层把娃盖回去(这是「归」,对应每个函数里的第二个printf)。每个函数的第二个printf都要等它调用的下一层递归完全执行完才会跑,所以就出现了先1到5、再5到1的输出顺序。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:04:06