Python递归为何失败?为何返回[]并触发最大递归深度?
递归失败原因分析
首先明确关键参数值:parents = df.parent.dropna().unique().astype(int)执行后得到的是[1,2,5],所以parents[1]的值是2。
无限递归的触发过程
调用find_parent(2)后,执行流程如下:
- 第一次调用:将整数2转为列表
[2],查找parent为2的行,对应的id是[2,3],递归调用find_parent([2,3])。 - 第二次调用:传入列表
[2,3],查找parent属于[2,3]的行——其中parent=2的id仍是2,3,parent=3没有匹配的行,所以得到的id列表还是[2,3],再次递归调用find_parent([2,3])。 - 自此进入无限循环:每次递归的输入参数都是
[2,3],永远无法触发len(init_parent) == 0的终止条件,直到Python触发最大递归深度限制,抛出RecursionError。
为什么返回空列表[]
当递归深度超过Python的默认限制(通常是1000)时,解释器会强制终止递归并抛出异常。此时函数没有正常执行到返回语句,你看到的[]是异常处理后的默认返回值,而非函数的正常输出。
函数逻辑的核心问题
- 未处理自环/循环引用:数据中存在
id=2的parent=2的行,导致递归时会反复处理同一个节点,无法收敛。 - 递归逻辑无收敛性:每次递归调用的参数没有向终止条件(空列表)靠近,反而陷入了固定输入的循环。
内容的提问来源于stack exchange,提问作者John Stud
相关产品推荐
相关产品推荐

