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函数开始,按顺序追踪每个任务的执行:
- 启动: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
- 任务C(k=2):满足
- 任务B继续执行下一行:
zad1(k-1),此时任务B的k是2,所以k-1=1,调用zad1(1)→ 任务D(k=1)- 任务D(k=1):满足
k<=2,直接return 0,任务D结束,回到任务B
- 任务D(k=1):满足
- 任务B执行最后一行
printf,此时任务B的k是2,输出:k=2 - 任务B结束,回到任务A
- 检查
- 任务B(k=3)
- 任务A继续执行下一行:
zad1(k-1),此时任务A的k是3,所以k-1=2,调用zad1(2)→ 任务E(k=2)- 任务E(k=2):满足
k<=2,直接return 0,任务E结束,回到任务A
- 任务E(k=2):满足
- 任务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
相关产品推荐
相关产品推荐

