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

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)时,整个过程是这样的:

  1. 进入yo(5):判断5>0为真,于是先执行yo(4)——这时候yo(5)里的printf语句并没有执行,而是被暂时“挂起”,等待递归调用完成。
  2. 进入yo(4):同样4>0为真,执行yo(3),yo(4)的printf也被挂起。
  3. 这个“调用-挂起”的过程会一直持续,直到调用yo(0):
    • 此时0>0为假,跳过递归调用,直接执行printf("%d", 0),输出0。
  4. 现在yo(0)执行完毕,程序会回到上一层的yo(1):
    • yo(1)的递归调用已经完成,接下来执行它被挂起的printf("%d", 1),输出1。
  5. 接着回到yo(2),执行printf("%d", 2),输出2。
  6. 以此类推,直到回到最开始的yo(5),执行它的printf("%d", 5),输出5。

所以最终的输出就是012345,而不是你预期的0。你之前的误解是以为递归到yo(0)就结束了,但实际上每一层递归调用完成后,都会回到上一层继续执行剩下的代码(也就是那个printf)。

小提示

你的yo函数声明为int类型,但没有返回值,这是一个不规范的写法,建议改成void yo(int a),避免编译器警告。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:16:31