如何为组合编写递归函数

时间:2013-12-10 03:40:20

标签: java recursion discrete-mathematics

我正在进行递归函数,我理解如何编写基本函数,但我对我的学习指南有一个问题,我不明白。

。编写一个名为Combinations的递归函数的代码,用于计算nCr。假设nCr可以如下计算:

nCr = 1 if r = 0 or if r = n and
nCr = (n-1)C(r-1) + (n-1)Cr

有人可以帮助我解决这个问题或以外行的方式解释一下吗?谢谢!

2 个答案:

答案 0 :(得分:9)

问题确实包含所有信息。它告诉你如何计算nCr - 并且在很多时候,你通过计算另一个nCr(具有较小的参数)来计算它。所以你的功能可能如下所示:

int nCr(n, r) {
  if (r == 0 || r == n) return 1;  // stop recursion, we know the answer.
  return nCr(n-1, r-1) + nCr(n-1, r); // the answer is made of the sum of two "easier" ones
}

这正在尽可能地翻译。让我们通过计算看看它在实践中是如何运作的

nCr(4,2)
= nCr(4-1, 2-1) + nCr(4-1, 2)
= nCr(3, 1) + nCr(3, 2)
= nCr(3-1, 1) + nCr(3-1,0) + nCr(3-1, 2-1) + nCr(3-1, 2)
= nCr(2, 1) + nCr(2,0) + nCr(2,1) + nCr(2,2)
= nCr(1, 0) + nCr(1,1) + 1 + nCr(1,0) + nCr(1,1) + 1
= 1 + 1 + 1 + 1 + 1 + 1
= 6

当然我们已经知道了:

nCr(4,2) = (4 * 3) / (2 * 1) = 6

答案 1 :(得分:1)

递归函数包括对自身的调用和终止案例

示例中的

nCr = 1 if r = 0 or if r = n形成终止

(n-1)C(r-1) + (n-1)Cr是递归

所以你的代码应该像这样看待

int nCR(int n, int r){
    if (r == 0 || r == n){
        return 1; //terminate
    }
    else{
        return nCr(n-1, r-1) + nCr(n-1, r); //recursive calls
    }
}