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

递归函数追踪疑问:为何程序输出n=-1后又打印n=0和n=1?

递归调用栈的执行过程拆解

嘿,这事儿核心是递归调用栈的“先递后归”特性,咱们一步步跟着代码跑一遍,你就能明白为啥最后会打出n = 0和n = 1了。

先把你的代码贴出来方便对照:

#include <stdio.h>
void countdown (int n) {
    printf("n = %d\t", n);
    n--;
    if (n >= 0) {
        countdown(n);
    }
    printf("n = %d\t", n);
}
int main() {
    countdown(2);
    return 0;
}

逐步执行流程

咱们把每一次函数调用的生命周期拆解开:

  1. 第一次调用:countdown(2)
    • 执行第一个printf:输出 n = 2
    • n减到1,满足n >= 0,调用countdown(1),此时这个函数的执行暂停在countdown(n);这一行,等着子调用返回。
  2. 第二次调用:countdown(1)
    • 执行第一个printf:输出 n = 1
    • n减到0,满足n >= 0,调用countdown(0),同样暂停在递归调用行。
  3. 第三次调用:countdown(0)
    • 执行第一个printf:输出 n = 0
    • n减到-1,不满足n >= 0,跳过递归调用。
    • 执行第二个printf:此时n是-1,输出 n = -1
    • 这个函数执行完毕,返回上一层(也就是countdown(1)的暂停位置)。
  4. 回到countdown(1)的暂停位置
    • 继续执行剩下的代码:第二个printf,此时这个函数里的n是之前减到的0,输出 n = 0
    • countdown(1)执行完毕,返回最上层的countdown(2)。
  5. 回到countdown(2)的暂停位置
    • 继续执行剩下的代码:第二个printf,此时这个函数里的n是之前减到的1,输出 n = 1
    • 整个递归流程结束。

把这些输出连起来,就是你看到的:n = 2 n = 1 n = 0 n = -1 n = 0 n = 1。

简单说,递归就像套娃:先一层层往里“递”,每一层先做第一个打印;直到触底(不满足递归条件),再一层层往外“归”,每一层做完剩下的第二个打印。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:13:14