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

C语言递归代码执行顺序咨询:示例代码后续流程详解请求

你的C代码执行顺序详细拆解

先把你的代码重新整理(修正换行符):

#include <stdio.h>

int zad1(int k) {
    if (k <= 2) 
        return 0;
    printf("k = %d\n", k);
    zad1(--k);
    zad1(k - 1);
    printf("k = %d\n", k);
}

void main() {
    zad1(4);
}

核心前提:每个zad1调用的k是独立的

每次调用zad1(k)时,都会创建一个独立的k副本,修改这个副本不会影响其他调用里的k值(除了当前函数内部对k的修改)。可以把每个zad1调用看成一个「独立的小任务」,每个任务有自己专属的k。


一步步拆解执行流程

我们从main函数开始,按顺序追踪每个任务的执行:

  1. 启动:main调用zad1(4) → 任务A(k=4)
    • 检查k<=2?4>2,不触发return,继续执行
    • 执行printf,输出:k=4
    • 执行zad1(--k):先把任务A的k改成3,然后调用zad1(3) → 任务B(k=3)
      • 任务B(k=3)
        • 检查k<=2?3>2,继续执行
        • 执行printf,输出:k=3
        • 执行zad1(--k):把任务B的k改成2,调用zad1(2) → 任务C(k=2)
          • 任务C(k=2):满足k<=2,直接return 0,任务C结束,回到任务B
        • 任务B继续执行下一行:zad1(k-1),此时任务B的k是2,所以k-1=1,调用zad1(1) → 任务D(k=1)
          • 任务D(k=1):满足k<=2,直接return 0,任务D结束,回到任务B
        • 任务B执行最后一行printf,此时任务B的k是2,输出:k=2
        • 任务B结束,回到任务A
    • 任务A继续执行下一行:zad1(k-1),此时任务A的k是3,所以k-1=2,调用zad1(2) → 任务E(k=2)
      • 任务E(k=2):满足k<=2,直接return 0,任务E结束,回到任务A
    • 任务A执行最后一行printf,此时任务A的k是3,输出:k=3
    • 任务A结束,回到main,程序终止

完整输出结果

按顺序输出的内容是:

k = 4
k = 3
k = 2
k = 3

补充说明

  • 你之前只看到k=4和k=3,是因为后面的输出是在递归调用返回后才执行的——递归就像“钻进去再爬出来”,先一层层调用到最底层(k<=2的情况),然后再从底层往上执行剩下的代码(也就是最后那个printf)。
  • --k是先减1再调用,所以会修改当前任务里的k值;而k-1是计算出一个新值传入,不会修改当前任务的k。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 09:35:33