Python中用for循环实现递归导致内核重启的原因解析
为何for循环实现的递归countdown会引发内核重启?
你用for循环写的递归countdown函数运行后输出大量0,随后内核重启,但用if条件实现就正常,本质是无限递归导致栈溢出,具体原因拆解如下:
问题代码对比
for循环实现代码
def countdown(n): for n in range(0,5): print(n) countdown(n-1) countdown(2)
if条件实现代码
def countdown(n): if n == 0: print("blast of") else: print(n) countdown(n-1) countdown(5)
核心原因分析
- if版本的递归有明确终止条件:当
n == 0时,函数直接打印结束信息,不再调用自身,递归会逐层返回,不会无限嵌套。 - for版本的递归完全没有有效终止逻辑:
- 不管你调用
countdown(2)传入的初始n是多少,函数内部的for n in range(0,5)会直接把n重新赋值为0、1、2、3、4,强制循环5次。 - 当循环到
n=0时,会调用countdown(0-1)也就是countdown(-1),进入新的函数后,内部的for循环依然会把n重新赋值为0到4,再次触发countdown(-1)的调用,这个过程会无限重复。 - 每一次递归调用都会占用栈空间,无限递归会快速耗尽Python的递归深度限制,最终触发栈溢出,导致内核被迫重启。
- 不管你调用
简单说就是:for循环直接覆盖了你传入的参数n,而且不管递归到负数,内部都会重新生成0到4的循环,永远触发countdown(-1)的无限调用,直接把栈资源耗尽了。
内容的提问来源于stack exchange,提问作者Nidhi Kushwaha
相关产品推荐
相关产品推荐

