理解用于查找二项式系数的递归方法

时间:2015-02-04 16:31:31

标签: java

在尝试使用递归方法求解用于求二项式系数的赋值时,我想出了这个:

public class Binomial
{
   public static long binom(int n, int k)
   {
       if (k==n || k==0)
         return 1;
       else return binom(n-1,k-1) + binom(n-1, k);
  }

对于n=5; k=3,该方法返回值10.用k和n的一堆不同值尝试它们,它们都给出了预期的结果,因此代码有效,我只是不知道为什么以及如何。对于一个愚蠢的解释,我非常感激。谢谢!

3 个答案:

答案 0 :(得分:4)

这是Pascal的三角形,是二项式系数及其计算的可视化:

     1
    1 1
   1 2 1
  1 3 3 1

每个元素是它上面两个元素的总和。

现在,如果您查看递归公式binom(n, k) = binom(n-1,k-1) + binom(n-1, k),将n作为行号,将k作为行中元素的位置,您会发现正是以代数形式写下的上述规则。你需要的唯一的东西是边界情况,由你的if-else语句的“then”子句覆盖。

答案 1 :(得分:1)

为了证明这种递归方法有效,你必须证明两件事:

  • 该方法在基本情况下返回正确的值(即当kn或为零时),
  • 假设该方法返回m = n-1的正确值意味着该方法也适用于n

第一个语句非常正确(if语句可以做到)。

第二个陈述需要用铅笔和纸来解决一个简单的练习,其中你使用二项式系数的定义来证明其含义。

这种构建数学证明的方法称为mathematical induction。它对于编程中的递归方法的推理特别有用。一旦你对数学归纳的理解,特别是它的工作原理变得坚实,你就可以构建自己的递归方法,并且有更好的机会去理解别人写的递归方法。

答案 2 :(得分:1)

如评论和其他答案中所述,在维基百科中,您可以看到使用Pascal三角形可以理解递归公式。

您可以将binom(n,k)视为"从一组n)中选择k个元素的总体可能性。 假设您有一组n-1个元素,并且您知道选择任意数量的所有不同组合(0,1,2,3,4,...,n-1)。朋友来了,给你一个新的元素。现在您有n个元素,并想知道具有新集合的k个元素的组合数。现在有两种可能性:      - k是0或n(没有元素或所有元素):只有一种可能性。      - k是另一个数字:你可以使用你在开始时使用的n-1元素集中的新元素和k-1元素(记住你已经新的那个数字,从n-1个元素中取出k-1)或者你只能使用您在开头使用的集合中的元素(从n-1个元素中取出k)。

因此当n!= k和k!= 0时你可以说P(n,k)= P(n-1,k-1)+ P(n-1,k)你可以理解你的代码