组合计算不正确

时间:2018-09-24 10:28:53

标签: python recursion combinations

我在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个数字,但随后会出错。这是怎么发生的,更重要的是,您如何解决呢?

1 个答案:

答案 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