我编写了这段代码来计算组合的数量:
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:相比之下超过了最大递归深度
对于数字的阶乘这样简单的函数,你应该尽量避免递归。递归确实很强大,但有时会无缘无故被过度使用。
这是阶乘函数迭代版本的代码:
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。
但以上在某些情况下可能无法满足您的所有需求。