递归函数追踪疑问:为何程序输出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; }
逐步执行流程
咱们把每一次函数调用的生命周期拆解开:
- 第一次调用:countdown(2)
- 执行第一个
printf:输出n = 2 n减到1,满足n >= 0,调用countdown(1),此时这个函数的执行暂停在countdown(n);这一行,等着子调用返回。
- 执行第一个
- 第二次调用:countdown(1)
- 执行第一个
printf:输出n = 1 n减到0,满足n >= 0,调用countdown(0),同样暂停在递归调用行。
- 执行第一个
- 第三次调用:countdown(0)
- 执行第一个
printf:输出n = 0 n减到-1,不满足n >= 0,跳过递归调用。- 执行第二个
printf:此时n是-1,输出n = -1 - 这个函数执行完毕,返回上一层(也就是
countdown(1)的暂停位置)。
- 执行第一个
- 回到countdown(1)的暂停位置
- 继续执行剩下的代码:第二个
printf,此时这个函数里的n是之前减到的0,输出n = 0 countdown(1)执行完毕,返回最上层的countdown(2)。
- 继续执行剩下的代码:第二个
- 回到countdown(2)的暂停位置
- 继续执行剩下的代码:第二个
printf,此时这个函数里的n是之前减到的1,输出n = 1 - 整个递归流程结束。
- 继续执行剩下的代码:第二个
把这些输出连起来,就是你看到的:n = 2 n = 1 n = 0 n = -1 n = 0 n = 1。
简单说,递归就像套娃:先一层层往里“递”,每一层先做第一个打印;直到触底(不满足递归条件),再一层层往外“归”,每一层做完剩下的第二个打印。
内容的提问来源于stack exchange,提问作者22pac
相关产品推荐
相关产品推荐

