求解Python双重递归函数name(n)的执行顺序与输出原理
Python双递归代码运行逻辑解析
首先贴出待分析的代码:
def name(n): if n>0: name(n-1) name(n-1) print(n) name(5)
核心问题解答
两个递归调用的执行关系:完全串行先后执行,不存在同步运行。Python默认单线程逐行执行代码,必须等第一个
name(n-1)递归从头到尾跑完、完全返回后,才会启动第二个name(n-1)调用;等两个递归全部执行完毕,才会走到最后一行print(n)输出当前的参数值。输出序列和打印顺序的形成逻辑:
这段代码的执行逻辑本质是二叉树的后序遍历,每一层n的执行都严格遵循固定三步:执行第一个递归(左子树遍历)→执行第二个递归(右子树遍历)→打印当前n。我们从小规模参数代入就能直接推导出输出规律:- n=0时:不满足n>0的判断,直接返回,无任何输出
- n=1时:先执行name(0)(无输出),再执行name(0)(无输出),最后打印1 → 输出:
1 - n=2时:先执行完整的name(1)(输出1),再执行完整的name(1)(输出1),最后打印2 → 输出:
1,1,2 - n=3时:先执行完整的name(2)(输出1,1,2),再执行完整的name(2)(输出1,1,2),最后打印3 → 输出:
1,1,2,1,1,2,3 - 以此类推,每一层的输出都是「n-1对应的完整输出」重复两次,最后跟上当前n的打印值。
你看到的
1,1,2,1,1,2,3……序列就是这么来的:递归调用会一路压栈到最深处n=1才会触发第一次打印,等n=1的两次递归跑完打出第一个1、回到n=2层,再跑完第二个n=1的递归打出第二个1,才会打印n=2的值;之后回到n=3层的第二个递归分支,又要重新从n=1开始压栈执行一遍,所以会重复出现低层级的输出序列,直到两个分支都跑完才会打印当前层的数值。
注:递归执行过程中,每进入一层函数就会往系统调用栈压入一个独立的栈帧保存当前执行上下文,等当前层所有代码执行完才会出栈,回到上一层断点继续执行,不会出现跨层跳步执行的情况。
内容的提问来源于stack exchange,提问作者Sahil Sharma
相关产品推荐
相关产品推荐

