递归阶乘计算器 RecursionError

Recursive Factorial Calculator RecursionError

当我收到此错误时,此递归阶乘计算器一直运行良好,直到输入 994:"RecursionError: maximum recursion depth exceeded in comparison"。有人可以解释一下这是什么意思吗?递归的最大数量怎么可能?提前致谢。

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 限制了您可以进行的递归调用的深度。默认值为 1000,它被选为一个数字,这意味着您很可能在某处有无限递归。由于没有计算机可以跟踪无限量的递归调用(而且这样的程序永远不会完成),因此暂停并显示此错误消息被认为比计算机可以处理的深度重复更可取,这最终会导致堆栈溢出.

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

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

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

有内置的Function with Math library,它是改进的算法,可以快速获取阶乘的值,所以我们在写递归算法获取阶乘的值的时候,会有一个递归极限。所以如果我们使用内置库,那么我们就可以避免这个问题。

import math
math.factorial(5)

Answer : 120