我写来找到计算NCR的此函数有什么问题?

问题描述

我尝试使用这种关系来递归地找到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;
}