我在Wikipedia上发现C(n,k)=(n-k + 1)/ k * C(n,k-1)。 我自己做了证据,认为它是正确的。然后,我在函数中实现了该函数,该函数假定使用递归来计算组合,而不会达到python中的内置限制。效果很好..直到我投入大量。这是我的功能:
def choose(n, k):
if not k:
return 1
elif n < k:
return 0
else:
return int((((n - k + 1) / k)) * choose(n, (k - 1)))
如果您使用较小的数字(如select(1000,4)),它会起作用,但是,如果您尝试使用诸如select(1000,800)之类的数字,它将返回正确的前13个数字,但随后会出错。这是怎么发生的,更重要的是,您如何解决呢?
答案 0 :(得分:2)
(n - k + 1) / k
通常不是整数,因为k
不会总是除以n-k+1
,尽管它会除以choose(n, (k - 1)) * (n-k+1)
。
因此,为了始终操作整数(大小不受限制),您必须先相乘,然后然后除以整数除法:
def choose(n, k):
if k == 0:
return 1
elif n < k:
return 0
else:
return (n - k + 1) * choose(n, (k - 1)) // k