提问者:小点点

比较中超出的最大递归深度


我编写了这段代码来计算组合的数量:

def fact(n):
    return 1 if(n == 1) else n * fact(n - 1)

def combinations(n,k):
    return fact(n)/((fact(n - k) * fact(k)))

while(True):
    print(combinations(int(input()), int(input())))

阶乘函数似乎工作得很好。但是当我试图找到两个数字的组合时,为什么它会给我一个超过比较误差的最大递归深度?阶乘函数有什么问题吗,因为这似乎是错误的来源?

这是我得到的错误:

builtins. RuntimeError:相比之下超过了最大递归深度


共3个答案

匿名用户

对于数字的阶乘这样简单的函数,你应该尽量避免递归。递归确实很强大,但有时会无缘无故被过度使用。

这是阶乘函数迭代版本的代码:

def fact(n):
    result = 1
    for i in range(2, n + 1):
        result *= i
    return result

请注意Maxime在前面的答案中所说的,这正是您遇到的问题:您的函数没有考虑0的阶乘。

匿名用户

尝试更换:

def fact(n):
    return 1 if(n == 1) else n * fact(n - 1)

到:

def fact(n):
    return 1 if(n <= 1) else n * fact(n - 1)

因为如果您传递2个相同的数字,您将尝试计算事实(0)(这将调用事实(-1)事实(-2)等,直到最大递归深度误差)。

匿名用户

python 3. x版本以后的默认递归限制仅为2000,如果你一次又一次地调用同一个函数超过2000次,你将获得最大递归深度错误。理想的方法是编写一个没有递归的逻辑。但是如果你仍然坚持递归,请通过以下方式更改默认递归限制:

导入系统

sys. setpostsionlimited(10000)#它将递归限制设置为10000。

但以上在某些情况下可能无法满足您的所有需求。