【问题标题】:Combinations are not calculated correctly组合计算不正确
【发布时间】:2018-09-24 10:28:53
【问题描述】:

我在 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)))

如果您使用较小的数字(例如choose(1000, 4)),它会起作用,但是如果您尝试使用诸如choose(1000,800) 之类的数字,它将正确返回前13 个数字,但随后就会出错。这是怎么发生的,更重要的是,你是怎么解决的?

【问题讨论】:

标签: python recursion combinations


【解决方案1】:

(n - k + 1) / k 通常不是整数,因为k 不会总是除以 n-k+1,尽管它除以 choose(n, (k - 1)) * (n-k+1)

因此,为了始终操作整数(其大小不受限制),您必须先相乘,然后使用 integer 除法然后除:

def choose(n, k):
    if k == 0: 
        return 1
    elif n < k: 
        return 0
    else:
        return (n - k + 1) * choose(n, (k - 1)) // k

【讨论】:

  • 但这会返回一个错误,例如选择(1000,999)。有什么办法解决吗? @Thierry Lathuille
  • 您已达到递归限制,默认为 1000 级。如您所见,使用递归来计算组合数量无论如何都不是一种非常有效的方法。请改用循环。
  • 我的任务是用专门的递归来完成它@Thierry Lathuille
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多