在Python中对无限循环使用无限递归是一种罪恶吗?

时间:2011-11-02 03:29:05

标签: python c recursion infinite-loop function-calls

这个问题更多是关于好奇而不是实用。如果我正在编写一个应该永远运行的函数,例如一个守护进程,如果我从函数末尾再次调用该函数,Python将如何处理它?<​​/ p>

def daemonLoop():

    # Declare locals

    # Do stuff

    daemonLoop()

我很确定在 C 中执行此操作会导致堆栈溢出,但考虑到从 C 到Python的抽象级别,我猜测的是处理方式不同。

我会为此而下地狱吗?

6 个答案:

答案 0 :(得分:17)

在几乎所有会导致堆栈溢出的Python解释器中,就像在C中那样。允许这种情况的更高级别的特性称为Tail Call Optimization或尾部递归消除,the benevolent dictator of Python opposes adding this to the language。 / p>

这种风格被认为是Python的非惯用风格,首选简单的while True:循环。

答案 1 :(得分:5)

可以使用sys.getrecursionlimit()检索最大递归深度,并使用sys.setrecursionlimit()进行设置。

  

我会为此而下地狱吗?

是。 CPython没有尾部递归消除/最后呼叫优化。

def recurse():
    recurse()

recurse()

错误:

  # 1000 or so lines of this:
  File "", line 2, in recurse
RuntimeError: maximum recursion depth exceeded

答案 2 :(得分:1)

如果你永远不会从daemonLoop返回,那么Python解释器的C版本(可能就是你正在使用的版本)最终会引发错误。我不确定其他版本。

答案 3 :(得分:1)

我不知道为什么当你可以简单地拥有一个无限的while循环时,你会考虑做类似的事情。无论如何,你的问题是否有效:

...
  File "test.py", line 7, in daemonLoop
    daemonLoop()
  File "test.py", line 7, in daemonLoop
    daemonLoop()
RuntimeError: maximum recursion depth exceeded

所以是的,不管怎样。

答案 4 :(得分:0)

可能不是个好主意......

def forever(): forever()

forever()

RuntimeError:超出最大递归深度

http://paulbarry.com/articles/2009/09/02/infinite-recursion

答案 5 :(得分:0)

(define forever (lambda () (forever)))

这种递归是像Scheme那样的Lisp方言!