在Abelson / Sussman的经典著作计算机程序的结构和解释中,在有关树递归和斐波那契序列的第1.2.2节中,它们显示了以下图像:
在计算第五斐波那契数时生成的树递归过程
然后他们写道:“注意(fib 3)
的整个计算-几乎完成了一半的工作-是重复的。实际上,不难证明该过程将计算{{1} }或(fib 1)
(通常是上述树中的叶子数)精确地是 Fib(n + 1)。”
我了解他们正在就树递归问题以及斐波纳契树递归的经典案例如何效率低下提出意见,因为递归函数会两次调用自身:
用于计算斐波那契数的树递归函数
我的问题是,为什么显而易见(即“不难显示”)的叶子数量等于序列中的下一个斐波那契数 ?我可以从视觉上看到这种情况,但是我没有看到关于为什么叶子数量(减少的(fib 0)
和fib 1
计算)应该成为下一个斐波那契指标的联系数字(在本例中为8,即Fib 6,即第六个斐波那契数,即 Fib n + 1 ,其中 n 为5)。
很明显,斐波那契数列是如何计算的-序列中前两个数字的和产生了当前数,但是为什么叶子的数量恰好等于序列中的下一个数?那里的联系是什么(除了显而易见的联系之外,将其查看并相加1和0的叶子实际上在这种情况下的总数为8,这是下一个(第六个)斐波那契数,依此类推上)?
答案 0 :(得分:2)
“不难展示”比“显而易见”难。
在两种基本情况下使用归纳法。
我们称Fib(x)
,Fib01(x)
中的计算次数。
然后,
Fib01(0) = 1 by definition, which is Fib(1)
Fib01(1) = 1 by definition, which is Fib(2)
现在假设 QED。Fib01(k) = Fib(k+1)
对于k Fib01(n) = Fib01(n-1) + Fib01(n-2)
= Fib(n) + Fib(n-1)
= Fib(n+1) by definition
答案 1 :(得分:1)
n = 1个子句的数量必须等于fib(n),因为那是唯一一个非零数的来源,并且如果1的总和等于fib(n),必须有fib(n)。
由于fib(n + 1)= fib(n)+ fib(n-1),我们只需要证明有fib(n-1)叶子计算fib(0)。对我来说,如何证明这一点还不那么明显,但也许可以归纳为先前的案例吗?
那么,也许一种更简单的方法就是简单地归纳整个过程。
对于我们的基本情况:
归纳步骤:要计算任意N的fib(N),我们一次计算fib(N-1),一次计算fib(N-2),然后将其结果相加。通过归纳,树中有fib(N)的叶子来自我们计算的fib(N-1),树中有fib(N-1)的叶子来自我们计算的fib(N-2)。
因此,在我们的总体树中有fib(N)+ fib(N-1)叶,这等于fib(N + 1)。 QED。
答案 2 :(得分:0)
我们可以通过推断来证明这一点。
Fib(0)
的叶子数= 1。
Fib(1)
= 1的叶子数。
现在,表达式Fib(2)
基本上是Fib(1) + Fib(0)
的总和,即Fib(2) = Fib(1) + Fib(0)
。因此,从树本身,您可以看到Fib(2)
的叶子数等于Fib(1)
和Fib(0)
的叶子总数。因此,Fib(2)
的叶子数等于2。
接下来,对于Fib(3)
,叶子数将是Fib(2)
和Fib(1)
的叶子数之和,即2 + 1 = 3
正如您现在必须已经观察到的,这遵循类似于斐波那契数列的模式。实际上,如果我们将Fib(n)
的叶子数定义为FibLeaves(n)
,那么我们可以看到该系列Fib(n)
向左移动了1个空格。
Fib(n) = 0, 1, 1, 2, 3, 5, 8, 13, 21, ..
FibLeaves(n) = 1, 1, 2, 3, 5, 8, 13, 21, ..
因此,叶子数将等于Fib(n + 1)