当前位置: 首页 > 知识库问答 >
问题:

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

欧照
2023-03-14

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

计算第五个斐波那契数时生成的树递归过程

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

我知道他们正在强调树递归以及斐波那契树递归的这个经典案例是如何低效的,因为递归函数调用了自己两次:

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

我的问题是,为什么很明显(即“不难证明”)树叶的数量等于序列中的下一个斐波那契数?我可以从视觉上看到情况是这样的,但我没有看到叶子数量(减少的fib 1和fib 0计算)为什么应该是下一个Fibonacci数(在本例中为fib 6,即第六个Fibonacci数,即fib n 1,其中n为5)的指标的联系。

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

共有3个答案

宋嘉懿
2023-03-14

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

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),那么我们可以看到这个序列左移了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)

柏高洁
2023-03-14

n=1子句的数量必须等于fib(n),因为这是唯一一个非零数字来自的地方,如果一些1的总和等于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。

漆雕令秋
2023-03-14

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

使用两种基本情况的归纳法<让我们调用Fib(x),Fib01(x)中的计算数<然后,

Fib01(0) = 1 by definition, which is Fib(1) 
Fib01(1) = 1 by definition, which is Fib(2)
Fib01(n) = Fib01(n-1) + Fib01(n-2) 
         = Fib(n) + Fib(n-1) 
         = Fib(n+1) by definition

QED。

 类似资料:
  • 我一直在试图理解Scheme中的尾部递归,我很难理解在使用斐波那契尾部递归的go-to示例中发生了什么。。。 如果这是尾递归或迭代斐波那契的代码: 我基本上可以理解每一行上发生的事情,除了这里: 这一行到底发生了什么?我在任何地方都找不到解释。我是计划的新手,到目前为止语法非常混乱。 或者有人能解释每一行发生了什么吗?这是我的基本理解,但我不确定我是否正确: 谢谢

  • 问题内容: 请解释以下简单代码: 我对最后一行感到困惑,特别是因为例如,如果n = 5,则将调用fibonacci(4)+ fibonacci(3),依此类推,但我不理解该算法如何以此来计算索引5的值方法。请详细解释! 问题答案: 在斐波那契数列中,每一项都是前两项的总和。因此,你编写了一个递归算法。 所以, 现在你已经知道了。因此,你可以随后计算其他值。 现在, 从斐波那契数列中我们可以看到斐波

  • 问题内容: 我在Java世界中相对较新,遇到了一个我不明白的问题。 我有一堂课(去斐波那契行): 现在的任务是在单独的线程中分别启动f(x-1)和f(x-2)。一次实现Thread类,另一次实现Runnable。您可能知道,这是我教授的一项练习。 我知道如何在Java中启动线程,并且从理论上知道整个Thread的工作原理,但是我找不到在此递归函数中启动单独的线程的解决方案。 运行功能必须做什么?

  • 问题内容: 我在大学为我的Programming II类编写的程序需要一些帮助。这个问题要求人们使用递归来计算斐波那契数列。必须将计算出的斐波那契数存储在一个数组中,以停止不必要的重复计算并减少计算时间。 我设法使程序在没有数组和存储的情况下运行,现在我试图实现该功能,但遇到了麻烦。我不确定如何组织它。我已经浏览了Google并浏览了一些书,但没有太多帮助我解决如何实施解决方案的方法。 上面是不正

  • 1. 前言 本节内容是递归算法系列之一:斐波那契数列递归求解,主要介绍了斐波那契数列的定义,然后用递归的实现思想分析了一下斐波那契数列,最后给出了基于 Java 代码应用递归思想实现斐波那契数列的代码实现及简单讲解。 2. 什么是斐波那契数列? 斐波那契数列(Fibonacci sequence),也称之为黄金分割数列,由意大利数学家列昂纳多・斐波那契(Leonardo Fibonacci)提出。

  • 我有两种不同的方法,一种是用迭代法计算第n个元素的斐波那契序列,另一种是用递归法。 程序示例如下所示: 我试图找出哪种方法更快。我得出的结论是,对于较小数量的数字,递归速度更快,但随着第n个元素的值增加,递归速度变慢,迭代速度变快。以下是三个不同n的三个不同结果: 示例#1(n=10) 示例#2(n=20) 示例#3(n=30) 我真正想知道的是,为什么迭代突然变得更快,递归变得更慢。如果我错过了