问题描述
我尝试使用这种关系来递归地找到nCr的值:
nCr =(n-r + 1)/ r * nC(r-1)
int comb(int n,int r){
if(r == 0) return 1;
return ((n - r + 1) / r) * comb(n,r - 1);
}
对于6C2的呼叫,我得到12而不是15。我试图进行跟踪,但是我得到了正确的答案。任何输入表示赞赏!谢谢
解决方法
考虑comb(6,2)
时发生的情况。在第一个递归调用中,返回表达式变为:
return (5 / 2) * comb(6,1);
(5 / 2)
将进行整数除法,并给出不正确的2
。
由于实际上保证了nCr
的最终答案是整数,因此您可以通过简单地计算所有分子之前除以任何分母,像这样:
return (n - r + 1) * comb(n,r - 1) / r ;
这里是demo。
请注意,如果您担心分子值溢出int
,则可以重新构造方程式,或者使用更容易取消条件的其他公式。
除整数的典型陷阱:
多少钱?
(3/2)*(4/3)
实际上是2,在C ++中是1:
3/2的整数除法等于1。
4/3的整数除法等于1。
因此,您需要强制进行浮点除法,例如通过这样做:
int comb(int n,int r){
if(r == 0) return 1;
return ((double)(n - r + 1) / r) * comb(n,r - 1);
}
祝你好运
,使用此公式。
n C r =(n / r)* n-1 C r-1;
您的代码更改为
int comb(int n,int r)
{
if(r > 0)
return (n/r)*comb(n-1,r-1);
else
return 1;
}