Java 理解求二项式系数的递归方法

Java 理解求二项式系数的递归方法,java,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的一系列不同的值进行了尝试,它们都给出了预期的

在尝试使用递归方法求解求二项式系数的赋值时,我得出了以下结论:

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的一系列不同的值进行了尝试,它们都给出了预期的结果,因此代码可以工作,我只是不知道为什么以及如何工作。如果能给我一个简单的解释,我将不胜感激。谢谢

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

  • 该方法在基本情况下返回正确的值(即
    k
    n
    或为零时),以及
  • 假设该方法为
    m=n-1
    返回正确的值,则意味着该方法也适用于
    n
第一条语句非常正确(如果语句正确,则为

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


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

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

  • 该方法在基本情况下返回正确的值(即
    k
    n
    或为零时),以及
  • 假设该方法为
    m=n-1
    返回正确的值,则意味着该方法也适用于
    n
第一条语句非常正确(如果
语句正确,则为

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


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

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

     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”子句中。

这是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”子句中。

正如在评论和其他答案中所说,在维基百科中,你可以看到递归公式可以用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),你可以理解你的代码。

正如在评论和其他答案中所说,在维基百科中,你可以看到递归公式可以用帕斯卡三角形来理解

你可以把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,您就可以理解您的代码。

在这种情况下,您最适合拿起笔和纸,为一个简单的案例写下逻辑步骤。比如binom(3,2)。它之所以有效,是因为有一些数学上的原因,请参见使用