You need to enable JavaScript to run this app. Python递归执行流程疑问:为何recursion(243)输出9.0、27.0、81.0而非仅9.0
优惠活动
大模型
产品
解决方案
定价
更多

Python递归执行流程疑问:为何recursion(243)输出9.0、27.0、81.0而非仅9.0

递归代码执行逻辑与输出差异说明

预期和实际输出存在差异的核心原因

大部分人初次接触这段代码时,都会默认函数碰到递归自调用后就会直接终止当前层的执行,后续代码不会运行。但Python的函数栈机制完全不是这个逻辑:

  • 只有当函数碰到return、抛出未捕获异常、或者执行完所有代码块,才会退出当前函数的栈帧
  • 当程序停在递归调用语句的位置去执行内层函数时,当前层所有未执行完的代码(包括递归调用之后的print语句)都会被暂存,等所有嵌套的内层函数全部退出后,再按栈的后进先出顺序接着执行剩余逻辑。

逐步骤拆解完整执行流程

从最外层调用recursion(243)开始,每一层的执行状态都可以被清晰跟踪:

  1. 第一层入栈:传入参数n=243
    • 判断n < 10:243不满足终止条件
    • 计算m = 243 / 3 = 81.0
    • 执行recursion(m)即recursion(81.0):暂存当前层的print(m)执行状态,程序跳转至内层函数
  2. 第二层入栈:传入参数n=81.0
    • 判断n < 10:81不满足终止条件
    • 计算m = 81.0 / 3 = 27.0
    • 执行recursion(27.0):同样暂存当前层的执行状态,跳转至更内层的递归
  3. 第三层入栈:传入参数n=27.0
    • 判断n < 10:27不满足终止条件
    • 计算m = 27.0 / 3 = 9.0
    • 执行recursion(9.0):暂存当前层的执行状态,跳转至更内层的递归
  4. 第四层入栈:传入参数n=9.0
    • 判断n < 10:满足终止条件,直接执行return,无任何输出

所有内层递归执行完成后,栈中暂存的各层会按照后进先出的顺序恢复执行,依次跑完之前挂起的print语句:

  • 最先恢复第三层的执行状态,输出9.0
  • 接着恢复第二层的执行状态,输出27.0
  • 最后恢复最外层的执行状态,输出81.0

这就是代码实际输出三行结果的根本原因。

如何实现你预期的“仅输出9.0”效果

如果想让代码只打印最内层的9.0,只需要把print语句移动到递归终止的分支内即可,示例代码如下:

def recursion(n):
    if n < 10:
        print(n) # 打印逻辑放在终止分支,仅会在最深层的递归触发
        return
    m = n/3
    recursion(m)

recursion(243)

运行这段调整后的代码,就只会输出9.0,和你最初的预期完全一致。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.29 08:36:07