[英]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。我試圖追蹤,但我得到了正確的答案。 任何輸入表示贊賞! 謝謝
考慮一下當你做comb(6, 2)
時會發生什么。 在第一次遞歸調用中,返回表達式變為:
return (5 / 2) * comb(6, 1);
(5 / 2)
將執行 integer 除法並給出不正確的2
。
由於nCr
的最終答案實際上保證了結果是 integer,因此您可以通過在除以任何分母之前簡單地計算所有分子來修復等式,如下所示:
return (n - r + 1) * comb(n , r - 1) / r ;
這是一個演示。
請注意,如果您擔心分子值溢出int
,您可以重新構造方程,或使用另一個更容易更早取消項的公式。
整數除法的典型陷阱:
多少錢:
(3/2)*(4/3)
實際上是 2,在 C++ 中是 1:
Integer 除以 3/2 等於 1。
Integer 除以 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 Z0D61F8370CAD114D61F8370CAD14D412F80Br -D4
您的代碼更改為,
int comb(int n, int r)
{
if(r > 0)
return (n/r)*comb(n-1,r-1);
else
return 1;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.