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)时:- 先执行第一个
printf,输出1 - 检查
1 < 5成立,于是调用Count(2)——这就是「递」的开始,咱们钻进下一层函数了
- 先执行第一个
- 进入
Count(2):- 先执行第一个
printf,输出2 - 检查
2 <5成立,调用Count(3),继续递
- 先执行第一个
- 进入
Count(3):- 第一个
printf输出3 - 检查
3<5成立,调用Count(4)
- 第一个
- 进入
Count(4):- 第一个
printf输出4 - 检查
4<5成立,调用Count(5)
- 第一个
- 进入
Count(5):- 第一个
printf输出5 - 检查
5<5?不成立!所以跳过递归调用,现在终于到了「归」的阶段 - 执行第二个
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
相关产品推荐
相关产品推荐

