Python递归函数无return时异常输出的执行流程解析问询
Python递归函数异常输出原理解析
首先明确基础规则:Python中数值类型的函数参数是局部变量,每一层递归的num独立存储,修改不会影响其他层的变量值。
无return版本的异常执行流程
你观察到的乱序重复输出,核心原因是递归调用返回后,当前层的while循环并没有终止,会继续判断条件是否满足,触发重复执行,我们以初始调用recur(0)为例逐段拆解执行过程:
- 第一层调用
num=0,满足0<6:打印0,num自增为1,调用recur(1),进入第二层 - 第二层调用
num=1,满足1<6:打印1,num自增为2,调用recur(2),进入第三层 - 第三层调用
num=2,满足2<6:打印2,num自增为3,调用recur(3),进入第四层 - 第四层调用
num=3,满足3<6:打印3,num自增为4,调用recur(4),进入第五层 - 第五层调用
num=4,满足4<6:打印4,num自增为5,调用recur(5),进入第六层 - 第六层调用
num=5,满足5<6:打印5,num自增为6,调用recur(6),进入第七层 - 第七层调用
num=6,不满足6<6,直接返回,回到第六层的recur(6)调用位置- 第六层当前
num=6,再次判断while条件不满足,返回,回到第五层的recur(5)调用位置
- 第六层当前
- 第五层当前
num=5,再次判断while 5<6满足,执行第二次循环:- 打印
5,num自增为6,调用recur(6)直接返回,再次判断while 6<6不满足,返回,回到第四层的recur(4)调用位置
- 打印
- 第四层当前
num=4,再次判断while 4<6满足,执行第二次循环:- 打印
4,num自增为5,调用recur(5),重复上述第六层到第五层返回的逻辑,会依次打印5、5,之后返回第四层,再次判断while 6<6不满足,返回,回到第三层的recur(3)调用位置
- 打印
- 以此类推,就会出现你看到的
0,1,2,3,4,5,5,4,5,5,3,4,5,5...的重复输出。
加return后输出正常的原因
添加return语句后,递归调用的执行结果会作为当前函数的返回值直接返回,当前函数的执行会立刻终止,不会再回到while循环执行后续的判断和逻辑,所以递归只会沿着「每层num+1调用」的路径一直执行到num=6的终止条件就逐层返回,不会出现循环重复执行的情况,输出自然符合预期。
内容的提问来源于stack exchange,提问作者Ha Tad
相关产品推荐
相关产品推荐

