在尝试使用递归方法求解用于求二项式系数的赋值时,我想出了这个:
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的一堆不同值尝试它们,它们都给出了预期的结果,因此代码有效,我只是不知道为什么以及如何。对于一个愚蠢的解释,我非常感激。谢谢!
答案 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)
为了证明这种递归方法有效,你必须证明两件事:
k
为n
或为零时),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)你可以理解你的代码