我为查找计算 NCR 而编写的这个函数有什么问题?
What's wrong with this function that I wrote to find calculate 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。我试图追踪,但我得到了正确的答案。任何输入表示赞赏!谢谢
使用这个公式。
nCr = ( n / r ) * n-1Cr-1;
您的代码更改为,
int comb(int n, int r)
{
if(r > 0)
return (n/r)*comb(n-1,r-1);
else
return 1;
}
想想当你这样做时会发生什么 comb(6, 2)
。在第一次递归调用中,return 表达式变为:
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);
}
祝你好运
我尝试使用这个关系递归地找到 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。我试图追踪,但我得到了正确的答案。任何输入表示赞赏!谢谢
使用这个公式。
nCr = ( n / r ) * n-1Cr-1;
您的代码更改为,
int comb(int n, int r)
{
if(r > 0)
return (n/r)*comb(n-1,r-1);
else
return 1;
}
想想当你这样做时会发生什么 comb(6, 2)
。在第一次递归调用中,return 表达式变为:
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);
}
祝你好运