递归程序控制流原理及C语言递归代码输出逻辑解析
递归代码输出解析与控制流说明
先把这段代码的执行过程一步步拆解,就能明白后半段递减输出的原因:
程序从
main启动,调用out(5):- 此时
k=5,不满足k==10的终止条件,先执行printf("%d", k),输出5。 - 接着调用
out(6),进入新的函数执行环境。
- 此时
进入
out(6):k=6≠10,执行printf("%d",6),输出6。- 调用
out(7)。
进入
out(7):- 输出
7,调用out(8)。
- 输出
进入
out(8):- 输出
8,调用out(9)。
- 输出
进入
out(9):- 输出
9,调用out(10)。
- 输出
进入
out(10):k=10触发终止条件,直接return 1,回到out(9)中调用out(10)的位置。
回到
out(9):- 递归调用已完成,现在执行调用语句后面的
printf("%d",k),输出9。 out(9)执行完毕,回到out(8)的调用位置。
- 递归调用已完成,现在执行调用语句后面的
回到
out(8):- 执行剩余的
printf("%d",8),输出8,回到out(7)。
- 执行剩余的
以此类推,依次回到
out(7)输出7、out(6)输出6、out(5)输出5。
把所有输出连起来就是5678998765,后半段的递减输出,本质是递归调用返回后,执行了每个函数中递归调用语句之后的代码。
递归程序的控制流逻辑
递归的核心依赖函数调用栈:
- 每调用一次递归函数,系统会在内存栈区创建一个新的「栈帧」,里面保存当前函数的参数、局部变量,以及当前执行到的代码位置。
- 当函数遇到终止条件(这里是
k==10)时,会返回上一层调用的位置,同时当前栈帧被销毁。 - 上一层函数会从之前暂停的位置(也就是递归调用语句的下一行)继续执行剩余代码,执行完后再返回更上一层,直到回到最初的调用点(
main中的out(5))。
简单说,递归是先「深入」到终止条件,再「回溯」执行每个函数中未完成的代码,这就是先递增输出、再递减输出的本质原因。
内容的提问来源于stack exchange,提问作者HelpMe
相关产品推荐
相关产品推荐

