Python递归执行流程疑问:为何recursion(243)输出9.0、27.0、81.0而非仅9.0
递归代码执行逻辑与输出差异说明
预期和实际输出存在差异的核心原因
大部分人初次接触这段代码时,都会默认函数碰到递归自调用后就会直接终止当前层的执行,后续代码不会运行。但Python的函数栈机制完全不是这个逻辑:
- 只有当函数碰到
return、抛出未捕获异常、或者执行完所有代码块,才会退出当前函数的栈帧 - 当程序停在递归调用语句的位置去执行内层函数时,当前层所有未执行完的代码(包括递归调用之后的
print语句)都会被暂存,等所有嵌套的内层函数全部退出后,再按栈的后进先出顺序接着执行剩余逻辑。
逐步骤拆解完整执行流程
从最外层调用recursion(243)开始,每一层的执行状态都可以被清晰跟踪:
- 第一层入栈:传入参数
n=243- 判断
n < 10:243不满足终止条件 - 计算
m = 243 / 3 = 81.0 - 执行
recursion(m)即recursion(81.0):暂存当前层的print(m)执行状态,程序跳转至内层函数
- 判断
- 第二层入栈:传入参数
n=81.0- 判断
n < 10:81不满足终止条件 - 计算
m = 81.0 / 3 = 27.0 - 执行
recursion(27.0):同样暂存当前层的执行状态,跳转至更内层的递归
- 判断
- 第三层入栈:传入参数
n=27.0- 判断
n < 10:27不满足终止条件 - 计算
m = 27.0 / 3 = 9.0 - 执行
recursion(9.0):暂存当前层的执行状态,跳转至更内层的递归
- 判断
- 第四层入栈:传入参数
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
相关产品推荐
相关产品推荐

