簡體   English   中英

我寫的這個 function 有什么問題要計算 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。我試圖追蹤,但我得到了正確的答案。 任何輸入表示贊賞! 謝謝

考慮一下當你做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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM