代码:
#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;
}
答案 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;从键盘。像这样:
它应该可以正常工作,但如果您输入相当大的n
和k
,则可能需要很长时间才能完成您的程序。运行时间复杂度为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
这是您共享的简单递归示例中使用的内容。
关于你的第二个问题,不确定为什么你应该有任何问题。