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

Python递归输出元素顺序问题:为何print位置不同结果不同

递归调用中print位置对输出的影响解释

当输入为5时,两种代码的输出差异,本质是递归调用中代码执行顺序的不同,结合栈的执行逻辑就能明白:

第一种情况:print在递归调用前

代码如下:

def pr(n):
    if n >= 1:
        print(n)   # 1'st case
        pr(n - 1)

a = int(input())
pr(a)

执行流程:

  • 调用pr(5),先执行print(5),再发起pr(4)的调用
  • 进入pr(4),先执行print(4),再发起pr(3)的调用
  • 以此类推,直到pr(1)执行print(1)后,调用pr(0)(不满足n>=1,直接返回)
  • 之后所有未完成的函数调用依次返回,但没有剩余代码要执行
    最终输出:5 4 3 2 1

第二种情况:print在递归调用后

代码如下:

def pr(n):
    if n >= 1:
        pr(n - 1)
        print(n)  # 2'nd case

a = int(input())
pr(a)

执行流程:

  • 调用pr(5),先发起pr(4)的调用,print(5)暂时不执行
  • 进入pr(4),先发起pr(3)的调用,print(4)暂时不执行
  • 以此类推,直到pr(1)调用pr(0)(直接返回)
  • 此时回到pr(1),执行print(1),然后返回给pr(2)
  • pr(2)收到返回后,执行print(2),返回给pr(3)
  • 按这个逻辑依次向上,直到pr(5)执行print(5)
    最终输出:1 2 3 4 5

关于递归栈的疑惑解答

递归确实基于LIFO栈结构,但栈中保存的是未完成的函数调用上下文:

  • 第一种情况里,每个函数调用在压栈(发起下层递归)前,已经完成了print操作,所以先输出当前的n值
  • 第二种情况里,函数调用压栈后,要等下层递归全部完成,才会执行print,此时栈中最早压入的调用(pr(5))最后完成print,而最晚压入的pr(1)最先完成print,所以输出顺序反过来。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 10:55:24