Python 递归阶乘计算器递归错误

Python 递归阶乘计算器递归错误,python,recursion,factorial,Python,Recursion,Factorial,当我收到这个错误时,这个递归阶乘计算器一直运行良好,直到输入994:“RecursionError:比较中超过了最大递归深度”。有人能解释一下这是什么意思吗?怎么会有最大数量的递归?提前谢谢 def factorial(x): if( x == 0): return 1 else: return x * factorial(x - 1) while True: u_input = input("") print(factorial(

当我收到这个错误时,这个递归阶乘计算器一直运行良好,直到输入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限制了您可以进行的递归调用的深度。默认值是1000,它被选为一个数字,这意味着您很可能在某个地方有无限递归。由于没有一台计算机能够跟踪无限多的递归调用(而且这样的程序无论如何也不会完成),因此,使用此错误消息停止比计算机能够处理的深度重复调用更可取,因为这最终会导致堆栈溢出

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

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

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

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

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

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

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

有内置的函数和数学库,它是一种改进的算法,可以快速获得阶乘值,因此当我们编写递归算法来获得阶乘值时,将有一个递归限制。因此,如果我们使用内置库,那么我们就可以避免这个问题

import math
math.factorial(5)
答复:120


有内置的函数和数学库,它是改进的算法,可以快速得到阶乘的值,所以当我们编写递归算法来得到阶乘的值时,会有一个递归限制。因此,如果我们使用内置库,那么我们就可以避免这个问题

import math
math.factorial(5)
答复:120


可能重复的我已经看到了-我想知道什么是递归深度?可能重复的我已经看到了-我想知道什么是递归深度?为什么它会给它一个最大值?我也有一个迭代算法,但目前我正在试验寻找更快的方法,因为对于大数,迭代方法需要而@Matt除非你做错了什么,否则迭代版本应该更快。函数调用在时间和内存方面都很昂贵,因此存在限制。好吧-我不确定哪一个会更快,因为限制无法测试它,所以我假设我的迭代方法会更快-我将在问题中发布它。这意味着堆栈-程序内存中跟踪这类事情的部分-已满,因为它必须存储每个函数调用,直到它返回为止。为什么它会给它一个最大值?我也有一个迭代算法,但目前我正在尝试寻找更快的方法,因为对于大数,迭代方法需要一段时间。@Matt除非你做错了什么,否则迭代版本应该更快。函数调用在时间和内存方面都很昂贵,因此存在限制。好吧-我不确定哪一个会更快,因为限制无法测试它,所以我假设我的迭代方法会更快-我将在问题中发布它。这意味着堆栈-程序内存中跟踪这类事情的部分-已满,因为它必须存储每个函数调用,直到返回为止。