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

递归程序控制流原理及C语言递归代码输出逻辑解析

递归代码输出解析与控制流说明

先把这段代码的执行过程一步步拆解,就能明白后半段递减输出的原因:

  1. 程序从main启动,调用out(5):

    • 此时k=5,不满足k==10的终止条件,先执行printf("%d", k),输出5。
    • 接着调用out(6),进入新的函数执行环境。
  2. 进入out(6):

    • k=6≠10,执行printf("%d",6),输出6。
    • 调用out(7)。
  3. 进入out(7):

    • 输出7,调用out(8)。
  4. 进入out(8):

    • 输出8,调用out(9)。
  5. 进入out(9):

    • 输出9,调用out(10)。
  6. 进入out(10):

    • k=10触发终止条件,直接return 1,回到out(9)中调用out(10)的位置。
  7. 回到out(9):

    • 递归调用已完成,现在执行调用语句后面的printf("%d",k),输出9。
    • out(9)执行完毕,回到out(8)的调用位置。
  8. 回到out(8):

    • 执行剩余的printf("%d",8),输出8,回到out(7)。
  9. 以此类推,依次回到out(7)输出7、out(6)输出6、out(5)输出5。

把所有输出连起来就是5678998765,后半段的递减输出,本质是递归调用返回后,执行了每个函数中递归调用语句之后的代码。

递归程序的控制流逻辑

递归的核心依赖函数调用栈:

  • 每调用一次递归函数,系统会在内存栈区创建一个新的「栈帧」,里面保存当前函数的参数、局部变量,以及当前执行到的代码位置。
  • 当函数遇到终止条件(这里是k==10)时,会返回上一层调用的位置,同时当前栈帧被销毁。
  • 上一层函数会从之前暂停的位置(也就是递归调用语句的下一行)继续执行剩余代码,执行完后再返回更上一层,直到回到最初的调用点(main中的out(5))。

简单说,递归是先「深入」到终止条件,再「回溯」执行每个函数中未完成的代码,这就是先递增输出、再递减输出的本质原因。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 18:55:18