Python如何处理无限递归?
在玩Python的时候,我发现程序的栈大小基本上没有限制(我一直对一个数字进行幂运算,精度一直保持完美,即使到了几千位数字)。这让我想知道:如果我不小心进入了一个无限递归循环,Python会怎么处理呢?编译器会发现并报出栈溢出错误吗?还是程序会直接崩溃?我的CPU会不会烧掉?说实话,我并不想亲自去测试这个。
2 个回答
3
Python(至少是它的参考实现)不支持无限递归循环,像某些函数式编程语言那样。递归调用的深度一旦达到大约1000层(默认情况下),就会抛出一个异常,这个限制可以通过sys.setrecursionlimit来修改。所以,没错,程序会崩溃。
与大多数函数式编程语言不同,Python没有尾递归优化。我敢说,在Python中,所有的递归算法都应该转换成迭代形式(这很简单),否则你的实现就不算正确。
用户larsmans评论说,内置的递归深度限制对于大多数实际算法来说已经足够了,但迭代形式通常表现得更好——原因是,在Python中,函数调用的开销很大。
如果你在Python中循环一个永远不会抛出StopIteration的生成器,你就可以有一个无限循环。它会一直运行,直到你终止进程或者耗尽计算机资源(有时会让机器卡住)。
8
现在的电脑是不会因为用户写的代码而着火的,我敢保证。你可以自己试试:
def recurseInfinitely( n ):
recurseInfinitely(n+1)
recurseInfinitely(0)
运行这个程序后,你会看到这样的输出:
[...]
recurseInfinitely(n+1)
File "so.py", line 2, in recurseInfinitely
recurseInfinitely(n+1)
File "so.py", line 2, in recurseInfinitely
recurseInfinitely(n+1)
RuntimeError: maximum recursion depth exceeded
你可以捕捉到错误,并检查一下 n
的值:
def recurseInfinitely( n ):
try:
recurseInfinitely(n+1)
except RuntimeError:
print "We got to level %s before hitting the recursion limit."%n
然后你会得到:
我们在达到递归限制之前,已经到了第997层。