递归以获得n个人和k个组的不同组合的数量

时间:2010-11-07 00:13:08

标签: java recursion combinations

我正在使用Java练习递归,但我遇到了问题。我正在尝试制作一种方法,我称之为“群组”,其中包含了许多人以及有多少群组,并返回了人和群组的不同组合的数量。此外,群组中人员的排序无关紧要,群组的顺序也不重要。

我到目前为止的代码是:

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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的不同而更好地澄清问题。)