计算从一组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
但是我得到了其他数字......不要在我的代码中看到问题所在。
答案 0 :(得分:6)
我会尝试颠倒参数,因为写成n < k
。
我认为你的意思是:
>>> c(2, 1)
2
>>> c(5, 2)
10
答案 1 :(得分:5)
您的来电,例如c(2, 5)
表示n=2
和k=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似乎也有一些非常好的递归实现。