c ++对二项式系数递归函数的误解

时间:2016-03-20 11:55:44

标签: c++ recursion binomial-coefficients

代码:

#include<stdio.h>
int binomialCoeff(int n, int k)
{
  // Base Cases
  if (k==0 || k==n)
    return 1;
 else
  return  binomialCoeff(n-1, k-1) + binomialCoeff(n-1, k);
}
int main()
{
    int n = 5, k = 2;
    printf("Value of C(%d, %d) is %d ", n, k, binomialCoeff(n, k));
    return 0;
}

我认为我可以解决基本情况。当我们使用0代表n和k = n时,结果是0!/ 0!这是= 1.所以我们返回1. Formula

但是我无法理解这部分代码:

 return  binomialCoeff(n-1, k-1) + binomialCoeff(n-1, k);

对于n,值为5,对于k,值为2,得到结果10.(在公式中替换时)。formula 但为什么我们使用加法?

还有一件事。当我从键盘设置“n”和“k”时,为什么程序不起作用? 像这样:

int main()
{
    int n,k;
    cin>>n;
    cin>>k;
    printf("Value of C(%d, %d) is %d ", n, k, binomialCoeff(n, k));
    return 0;
}

3 个答案:

答案 0 :(得分:0)

  

但为什么我们要使用加法?

这是数学问题而不是编程问题,众所周知recursive formula for binomial coefficient calculation。确切地说,这个公式在您的程序中使用。

  

当我从键盘设置“n”和“k”时,为什么程序不起作用

代码看起来正确,除了你使用std :: istream作输入和printf输出。究竟什么不起作用?你输入n&gt; = k?

答案 1 :(得分:0)

return binomialCoeff(n-1, k-1) + binomialCoeff(n-1, k);

还记得Pascal Triangle吗?它恰好使用了这个递归公式和添加。

但是我可以看到你没有构建这个三角形,但只是递归地尝试在使用递归时反复计算一些二项式系数。记住已经计算的结果可能会大大提高您的程序性能。你的第二个问题可能就是这样:

  

为什么程序在我设置&#34; n&#34;和&#34; k&#34;从键盘。像这样:

它应该可以正常工作,但如果您输入相当大的nk,则可能需要很长时间才能完成您的程序。运行时间复杂度为O(n 2 )。使用n > 30,您可能会注意到执行时间很长。

答案 2 :(得分:0)

二项式系数的一个属性是: 对于所有1 <= k <= n-1,C(n,k)可写为C(n-1,k-1)+ C(n-1,k)。

所以C(3,2)= C(2,1)+ C(2,2)         或3 = 2 + 1

这是您共享的简单递归示例中使用的内容。

关于你的第二个问题,不确定为什么你应该有任何问题。