有多少组合可能?

时间:2013-05-29 20:00:14

标签: python recursion python-3.x

计算从一组k项中选择n个项目的方式的递归公式,表示为C(n,k),是:

           1                    if K = 0
C(n,k) = { 0                    if n<k
           c(n-1,k-1)+c(n-1,k)  otherwise

我正在尝试编写一个使用此递归公式计算C的递归函数C(n,k)。我写的代码应该按照我自己的方式工作,但它没有给我正确的答案。

这是我的代码:

def combinations(n,k):
    # base case
    if k ==0:
        return 1
    elif n<k:
        return 0
    # recursive case
    else:
        return combinations(n-1,k-1)+ combinations(n-1,k)

答案应如下所示:

>>> c(2, 1)
0
>>> c(1, 2)
2
>>> c(2, 5)
10

但是我得到了其他数字......不要在我的代码中看到问题所在。

3 个答案:

答案 0 :(得分:6)

我会尝试颠倒参数,因为写成n < k

我认为你的意思是:

>>> c(2, 1)
2
>>> c(5, 2)
10

答案 1 :(得分:5)

您的来电,例如c(2, 5)表示n=2k=5(根据您在问题顶部的c定义)。所以n < k因此结果应为0。这正是您的实施所发生的事情。并且所有其他示例也确实产生了实际上正确的结果。

您确定示例测试用例的参数是否具有正确的顺序?因为它们都是c(k, n) - 来电。因此,这些调用都是错误的,或者您c定义中的顺序已关闭。

答案 2 :(得分:4)

这是实际上不应该使用递归函数的时间之一。计算组合很容易直接进行。对于某些事情,比如阶乘函数,使用递归没有什么大不了的,因为无论如何它都可以通过尾递归进行优化。

原因如下:

为什么我们在编写程序时从不将此定义用于Fibonacci序列?

def fibbonacci(idx):
    if(idx < 2):
        return idx
    else:
        return fibbonacci(idx-1) + fibbonacci(idx-2)

原因在于,由于递归,它过分慢。出于同样的原因,应尽可能避免多次单独的递归调用。

如果您坚持使用递归,我建议您首先阅读this页面。更好的递归实现每次只需要一次递归调用。 Rosetta code似乎也有一些非常好的递归实现。