无法创建正确的N选择R方法

时间:2019-02-17 23:48:59

标签: java recursion combinations binomial-coefficients

我有这份作业来编写Java代码:

给定一组n个项,我们可以从n个中选择r个元素的方式是多少?这就是所谓的“选择函数”(或二项式系数),我们可以使用下面定义的递归关系来计算n个r大小的子集的数量(其中顺序不重要)。请注意,此定义建立在阶乘概念的基础上,因此请确保您先了解示例代码并在继续进行操作之前产生了一个可行的阶乘方法.C(n,r)= n! /(r!*(n-r)!)

我完全理解阶乘递归的最简单形式是如何工作的,但是到目前为止,我的代码是这样的:

    public static int NChooseR(int n, int r)
        {
            if( n == 1 || r == 1)
                return 1;
            else
                return (n * NChooseR( n - 1, r)/ n * NChooseR ((n-r) - 1, r) );
        }

例如,如果我的输入为n的5和r的3,则此方法应返回10。我试图弄清楚如何逐段编写此方法,因此我当前的代码应打印出60,因为( n * NChooseR(n-1,r)应该是5的阶乘,即120,而n * NChooseR((nr)-1应该是5-3的阶乘,实际上是2的阶乘,即2,但是我得到堆栈溢出错误。我已经尝试了很多其他方法,以至于我只是盯着我的代码尝试不同的尝试而徒劳无功。如果有人能够回答这个问题,您可以尝试像我这样解释它吗? m 5,因为到目前为止,互联网上没有任何信息对我有帮助,我感到非常沮丧,而且我不知道从这里去哪里。

1 个答案:

答案 0 :(得分:0)

首先:自r=1起,C(n,1) = n!/(n-1)! = n的初始值是错误的。
r=0起应该为C(n,0) = 1


第二:使用此递归公式
C(n,r) = C(n-1,r) + C(n-1,r-1)

n,r最终达到1,0,并使用预先计算的初始值进行标识 C(1,0) = 1C(n,0) = 1