【问题标题】:Recursive Factorial Calculator RecursionError递归阶乘计算器 RecursionError
【发布时间】:2017-04-19 05:33:53
【问题描述】:

当我收到以下错误时,这个递归阶乘计算器一直运行良好,直到输入 994:“RecursionError:比较中超出了最大递归深度”。有人可以解释一下这是什么意思吗?怎样才能有最大数量的递归?提前致谢。

def factorial(x):
    if( x == 0):
        return 1
    else:
        return x * factorial(x - 1)
while True:
    u_input = input("")
    print(factorial(int(u_input)))

def calc_factorial(num):
    num-=1
    fact_total = 1
    while num > 0:
        fact_total *= num
        num-=1
    return(fact_total)

编辑: 我知道递归正在将该函数中的函数作为循环重新使用,但我不明白递归深度是什么,并希望对此进行解释。我无法从另一个问题的答案中分辨出来。对造成的混乱表示歉意。

【问题讨论】:

标签: python recursion factorial


【解决方案1】:

递归调用就像任何其他函数调用一样,函数调用使用内存来跟踪每个函数内部的状态。你会注意到你得到一个很长的回溯,显示堆栈上的所有嵌套函数调用。由于内存是有限的,因此递归深度(嵌套函数调用的数量)本质上是有限的,即使没有 python 的强制限制。

【讨论】:

    【解决方案2】:

    错误的意思是:Python 限制了您可以进行的递归调用的深度。默认值为 1000,它被选为一个数字,这意味着您很可能在某处有无限递归。由于没有计算机可以跟踪无限数量的递归调用(并且这样的程序无论如何都不会完成),因此与此错误消息一起停止被视为比计算机可以处理的深度重复更可取,这最终导致堆栈溢出.

    如果您愿意,您可以使用sys.setrecursionlimit 更改此限制,但避免此问题的最佳方法是将您的程序更改为迭代工作而不是递归工作。幸运的是,这对于阶乘计算很容易:

    def factorial(x):
        result = 1
        for num in range(1, x+1):
            result *= num
        return result
    

    【讨论】:

    • 为什么给它一个最大值?
    • 我也有一个迭代算法,但目前我正在尝试寻找更快的方法,因为对于大量的迭代方法需要一段时间。
    • @Matt 除非你做错了什么,否则迭代版本应该更快。函数调用在时间和内存上都很昂贵,因此存在限制。
    • 好的-我不确定哪个会更快,并且由于限制无法测试它,所以我认为我的迭代方法会更快-我会在问题中发布它。
    • 这意味着堆栈 - 程序内存中跟踪此类事情的部分 - 已满,因为它必须存储每个函数调用直到它返回。
    【解决方案3】:

    内置Function with Math库,改进算法可以快速获取阶乘的值,所以当我们编写递归算法来获取阶乘的值时,会有一个递归限制强>。所以如果我们使用内置库,那么我们可以避免这个问题。

    import math
    math.factorial(5)
    

    答案:120

    【讨论】:

      猜你喜欢
      • 2015-04-19
      • 2016-04-14
      • 2015-01-08
      • 2022-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-28
      • 1970-01-01
      相关资源
      最近更新 更多