C语言递归函数疑问:为何下述程序的输出结果为012345?
递归代码执行逻辑详解
嘿,我来帮你拆解这段代码的运行过程,你困惑的核心是没搞懂递归调用栈的执行顺序——咱们一步步来理清楚:
首先先看你的代码:
#include<stdio.h> #include<conio.h> int yo(int a) { if(a>0) { yo(a-1); //using recursion function } printf("%d",a); //printing value } void main() { yo(5); getch(); }
递归调用的执行流程
当你在main里调用yo(5)时,整个过程是这样的:
- 进入
yo(5):判断5>0为真,于是先执行yo(4)——这时候yo(5)里的printf语句并没有执行,而是被暂时“挂起”,等待递归调用完成。 - 进入
yo(4):同样4>0为真,执行yo(3),yo(4)的printf也被挂起。 - 这个“调用-挂起”的过程会一直持续,直到调用
yo(0):- 此时
0>0为假,跳过递归调用,直接执行printf("%d", 0),输出0。
- 此时
- 现在
yo(0)执行完毕,程序会回到上一层的yo(1):yo(1)的递归调用已经完成,接下来执行它被挂起的printf("%d", 1),输出1。
- 接着回到
yo(2),执行printf("%d", 2),输出2。 - 以此类推,直到回到最开始的
yo(5),执行它的printf("%d", 5),输出5。
所以最终的输出就是012345,而不是你预期的0。你之前的误解是以为递归到yo(0)就结束了,但实际上每一层递归调用完成后,都会回到上一层继续执行剩下的代码(也就是那个printf)。
小提示
你的yo函数声明为int类型,但没有返回值,这是一个不规范的写法,建议改成void yo(int a),避免编译器警告。
内容的提问来源于stack exchange,提问作者Harshit Upadhyay
相关产品推荐
相关产品推荐

