因此,当玩弄Python时,我注意到程序的堆栈大小基本上没有限制(在数字上继续执行电源操作,即使在达到数千个数字后,精度也保持完美)。这让我想知道:如果我不小心进入Python的无限递归循环怎么办?编译器会注意到并抛出堆栈溢出错误吗?或者程序会崩溃吗?我的CPU会燃烧吗?诚实地说,这不是我渴望测试自己的东西。
答案 0 :(得分:6)
我保证,由于用户代码,现代计算机不会燃烧。亲自尝试一下:
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级。
答案 1 :(得分:3)
Python(至少参考实现)没有 - 你可以像某些函数式语言一样拥有无限递归循环。当递归达到大约1000深度时,它将抛出异常(默认情况下,可以使用sys.setrecursionlimit更改)。所以是的,程序会崩溃。
与大多数函数式语言不同,Python缺少尾递归优化。我敢说所有递归算法都应该在Python中转换为迭代形式(这样做很简单),否则你的实现并不是真的正确。
用户larsmans评论说内置的递归深度限制对于大多数实用算法来说已经足够好了,但是迭代形式通常表现得更好 - 原因是函数调用在Python中很昂贵。
如果循环遍历永不抛出StopIteration的生成器,则可以在Python中使用跑道循环。它将继续运行,直到(以及如果)您终止进程或耗尽计算机资源(有时会使机器停止运行)。