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
相关产品推荐
相关产品推荐

