Recursion 计算机程序结构和解释中的斐波那契树递归

Recursion 计算机程序结构和解释中的斐波那契树递归,recursion,scheme,fibonacci,sicp,Recursion,Scheme,Fibonacci,Sicp,在Abelson/Sussman的经典文本《计算机程序的结构和解释》中,在关于树递归和斐波那契序列的第1.2.2节中,他们展示了以下图像: 第五斐波那契数计算中的树递归过程 然后他们写道:“请注意,(fib 3)(几乎一半的工作)的整个计算都是重复的。事实上,不难证明该过程将计算(fib 1)或(fib 0)(通常,上述树中的叶子数)的次数正是fib(n+1)。” 我知道他们在强调树递归,以及Fibonacci树递归的这个经典例子是如何效率低下的,因为递归函数本身调用了两次: 计算斐波那契数的

在Abelson/Sussman的经典文本《计算机程序的结构和解释》中,在关于树递归和斐波那契序列的第1.2.2节中,他们展示了以下图像:

第五斐波那契数计算中的树递归过程

然后他们写道:“请注意,
(fib 3)
(几乎一半的工作)的整个计算都是重复的。事实上,不难证明该过程将计算
(fib 1)
(fib 0)
(通常,上述树中的叶子数)的次数正是fib(n+1)。”

我知道他们在强调树递归,以及Fibonacci树递归的这个经典例子是如何效率低下的,因为递归函数本身调用了两次:

计算斐波那契数的树递归函数

我的问题是,为什么很明显(即“不难证明”)树叶的数量等于序列中的下一个斐波那契数?我可以从视觉上看到这一点,但我看不到为什么叶子的数量(减少的
fib1
fib0
计算)应该是下一个斐波那契数的指标(在本例中是8,即fib6,即第六个斐波那契数,即fibn+1,其中n是5)


很明显,斐波那契数列是如何计算的——数列中前两个数的和会产生当前数,但为什么叶子的数目恰好等于数列中的下一个数?这里的联系是什么(除了显而易见的,看它并将1和0的叶子相加,事实上,在这种情况下,总计数为8,这是下一个(第6个)斐波那契数,依此类推)?

n=1子句的数量必须等于fib(n),因为这是非零数的唯一来源,如果一些1s的和等于fib(n),那么一定有fib(n)

由于fib(n+1)=fib(n)+fib(n-1),我们只需要证明存在计算fib(0)的fib(n-1)叶。我不太清楚如何证明这一点,但也许它与前一个案例不一样


也许一个更简单的方法就是归纳式地完成整个过程

对于我们的基本情况:

  • N=0:树中有fib(N+1)=fib(1)=1片叶子。通过检查证明
  • N=1:树中有fib(N+1)=fib(2)=1片叶子。通过检查证明
归纳步骤:为了计算任意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.

“不难表现”比“显而易见”更难

使用两个基本案例的归纳法。
让我们调用
Fib(x)
Fib01(x)

那么

现在假设kFib01(k)=Fib(k+1)

Fib01(n) = Fib01(n-1) + Fib01(n-2) 
         = Fib(n) + Fib(n-1) 
         = Fib(n+1) by definition

QED.

我们可以通过外推来证明这一点

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,…

n=1,1,2,3,5,8,13,21,…

因此,叶数将等于
Fib(n+1)

Fib01(n) = Fib01(n-1) + Fib01(n-2) 
         = Fib(n) + Fib(n-1) 
         = Fib(n+1) by definition