Python递归函数输出解析求助:为何会打印1到10?
嘿,刚学递归的时候卡在这里太正常了!我当初第一次接触递归也跟你一样,只看明白了“一直减到1”的部分,完全没意识到后面还有个“往回走”的步骤。咱们先把那个递归函数写出来(应该就是这种结构对吧?):
def print_1_to_10(n): if n == 1: print(1) else: print_1_to_10(n - 1) # 先调用自身处理更小的数 print(n) # 等上面的调用做完了再打印当前数
接下来咱们一步一步拆解调用print_1_to_10(10)的全过程:
第一步:递推阶段——一路“钻”到终止条件
当你调用print_1_to_10(10)的时候,因为10不等于1,所以它会先执行print_1_to_10(9),这时候**print(10)的代码根本还没运行**——它得等着前面的递归调用彻底做完才能轮到自己。
同样的,print_1_to_10(9)会调用print_1_to_10(8),print_1_to_10(8)调用print_1_to_10(7)……就这么一直“递推”下去,直到调用print_1_to_10(1)。
到了print_1_to_10(1),满足n == 1的条件,直接打印出1,这个函数调用就彻底结束了。
第二步:回溯阶段——从终止条件往回“补”打印
现在重点来了!当print_1_to_10(1)结束后,程序会回到刚才调用它的那个函数——也就是print_1_to_10(2)。之前print_1_to_10(2)只执行了print_1_to_10(1)这一步,现在这步做完了,就轮到执行后面的print(2)了,于是屏幕上就出现了2,然后print_1_to_10(2)也结束了。
接着程序回到print_1_to_10(3),它的递归调用(print_1_to_10(2))已经完成,现在执行print(3),打印出3……就这么一层一层往回“回溯”,每回到一层,就执行那层剩下的print(n)代码,直到回到最开始的print_1_to_10(10),执行print(10),整个流程就结束了。
简单说,递归其实分两个阶段:
- 递推:不断拆解问题,直到触达终止条件(你理解的那部分)
- 回溯:从终止条件开始,回到每一层未完成的函数调用,执行剩下的逻辑(你没明白的那部分)
就像你把一堆套娃从最大的10号开始拆,拆到最小的1号,然后再从1号开始一个个装回去,每装一个就把它的数字喊出来,最后就从1喊到10啦!
内容的提问来源于stack exchange,提问作者Kasper Fischer-Rasmussen

