Python如何处理无限递归?

时间:2014-07-22 23:15:31

标签: python recursion infinite

因此,当玩弄Python时,我注意到程序的堆栈大小基本上没有限制(在数字上继续执行电源操作,即使在达到数千个数字后,精度也保持完美)。这让我想知道:如果我不小心进入Python的无限递归循环怎么办?编译器会注意到并抛出堆栈溢出错误吗?或者程序会崩溃吗?我的CPU会燃烧吗?诚实地说,这不是我渴望测试自己的东西。

2 个答案:

答案 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中使用跑道循环。它将继续运行,直到(以及如果)您终止进程或耗尽计算机资源(有时会使机器停止运行)。