2010-11-07 59 views
3

我正在練習使用Java進行遞歸,並且遇到了問題。我試圖制定一種方法,我稱之爲「團體」,其中需要許多人和多少個團體,並返回人和團體的不同組合的數量。此外,組中人員的排序並不重要,組的排序也不重要。遞歸獲得n個人和k個組的不同組合的數量

我到目前爲止的代碼是:

public long groups(int n, int k) { 
    if(k==1) return 1; 
    if(k==n) return 1; 
    else return groups(n-1, k) + groups(n-1, k-1); 
} 

但是它返回錯誤的值。前兩行是基本情況,即如果有1個組,則只有一種方法可以將人員分開,這是合理的。另一種情況是,人數與團體人數一樣多,在這種情況下,只有一種方法可以將他們分開,每個人分成一組。最後一個陳述是我認爲我遇到問題的地方,我認爲每次它進行遞歸調用時,都必須取出一個人(n是人數,所以n-1),並且該人可以以太加入一個組(k)或創建自己的組(k-1)。

我只是遇到了一些問題,找出遞歸如何工作,並可以使用一些幫助。

這是我期待的值:

groups(2,1) = 1 
groups(2,2) = 1 
groups(3,2) = 3 
groups(4,2) = 7 
groups(4,3) = 6 
groups(5,3) = 25 
+0

請你能給預期並獲得答案的例子嗎? – 2010-11-07 00:19:57

+0

沒有處理'n 2010-11-07 09:51:31

+0

@mattbasta:[「作業與其他所謂的'元'標籤一樣,現在不鼓勵,「](http://meta.stackexchange.com/q/10812),但是,亞當,請遵循鏈接的作業指導原則,包括說明特殊限制,什麼你到目前爲止已經嘗試過了,問題的具體部分是什麼讓你感到困惑。 – 2010-11-08 16:13:37

回答

4

也有一些是在該部分的執行缺少

...這人可以醚加入一個組(K)...

我覺得這個人可以加入「K」羣體,所以代碼必須

public long groups(int n, int k) { 
     if(k==1) return 1; 
     if(k==n) return 1; 
     else return k * groups(n-1, k) + groups(n-1, k-1); 
    } 

(失蹤了由k乘法)

+0

啊!!!那正是我錯過的。非常感謝! – adammenges 2010-11-07 00:43:54

+0

哦,我會給你一個投票,但顯然我不能直到我有15的聲望。抱歉! :( – adammenges 2010-11-07 00:45:22

+0

沒有問題,我喜歡算法來解決任務,並感謝接受答案(得到了一些聲譽) – 2010-11-07 00:49:04

0

有一個更容易(更快)的方式來計算組合 - 這是binomial coefficient。雖然我可以理解你的老師可能希望你通過這種方式編寫遞歸函數來熟悉遞歸,但可以使用這個公式作爲檢查。

就你而言,你在這裏報告錯誤的期望值。你想要的是

groups(2,1) = 2 
groups(2,2) = 1 
groups(3,2) = 3 
groups(4,2) = 6 
groups(4,3) = 4 
groups(5,3) = 10 

和你發佈的代碼是正確的,如果上面的值是它應該返回的。

(如果沒有,也許你可以更好地解釋更清楚問題如何你從binomial coefficient解決不同澄清這個問題。)

+0

我的任務是這麼說的:「給定n個學生,返回可以將他們分成k組的多少種方法。」然後在我的問題中給出上面的值。 – adammenges 2010-11-07 00:36:36

+0

此外,當我運行代碼以上我得到:「基團(2,1):1個 組(2,2):1個 組(3,2):2個 組(4,2):3個 組(4,3):3 groups(5,4):4 groups(5,3):6「這與您給出的值不同。 – adammenges 2010-11-07 00:37:00

+0

@Adam:好的,有一些細節,我沒有注意到,直到我發佈後:爲了得到我給出的值,基本案例'if(k == 1)return 1;'將不得不改爲'if (k == 0)返回1'。 – 2010-11-07 02:22:27