代码之家  ›  专栏  ›  技术社区  ›  John Gordon

递归调用和非递归调用是否有单独的调用树深度?

  •  1
  • John Gordon  · 技术社区  · 3 年前

    众所周知,如果您有这样的函数:

    def foo():
        foo()
    

    该函数将调用自己1000次,然后得到 RecursionError 例外

    但是如果你有一千零一 不同的 相互调用的函数?即 a() 电话 b() 电话 c() 等等

    你在第1001次通话时会有什么错误吗?调用堆栈深度与递归情况下相同,即使没有任何实际的递归。

    1 回复  |  直到 3 年前
        1
  •  2
  •   Silvio Mayolo    3 年前

    RecursionError 当超过调用堆栈时抛出。这最多 通常地 由于递归而发生,但一般情况下也会发生。

    为了测试这一点,我们可以写一个 for 循环生成几百个相互调用的不同函数。

    
    function = lambda: "Success!"
    for _i in range(999):
        def new_function(f=function):
            f()
        function = new_function
    
    print(function())
    

    在999时,此操作失败 递归错误 (千分之一的函数调用是 lambda ,不是for循环的一部分)。将循环计数器更改为998,它运行良好。