recursion - 计算机程序结构和解释中的斐波那契树递归
问题描述
在 Abelson/Sussman 的经典文本,计算机程序的结构和解释中,在第 1.2.2 节关于树递归和斐波那契数列中,他们显示了这个图像:
计算第 5 个斐波那契数时生成的树递归过程
然后他们写道:“请注意,整个计算(fib 3)
——几乎一半的工作——是重复的。事实上,不难表明程序将计算的次数(fib 1)
或(fib 0)
(上述树中的叶子数,在general) 正好是Fib(n + 1)。”
我知道他们正在就树递归以及斐波那契树递归的这种经典案例是如何效率低下的,因为递归函数调用了自己两次:
用于计算斐波那契数的树递归函数
我的问题是,为什么叶子的数量等于序列中的下一个斐波那契数是显而易见的(即“不难证明”) ?我可以直观地看到情况确实如此,但我没有看到为什么叶子的数量(减少的向下fib 1
和fib 0
计算)应该是下一个斐波那契数的指标(在这种情况下是 8,即 Fib 6,即第6个斐波那契数,即Fib n+1,其中n为5)。
斐波那契数列是如何计算的很明显——序列中前两个数字的总和产生当前数字,但为什么叶子的数量恰好等于序列中的下一个数字?那里有什么联系(除了显而易见的是,查看它并将 1 和 0 叶子相加确实在这种情况下产生总计数 8,这是下一个(第 6 个)斐波那契数,所以上)?
解决方案
“不难表现”比“明显”更难。
对两个基本情况使用归纳法。
让我们称 , 中的计算Fib(x)
次数Fib01(x)
。
然后,
Fib01(0) = 1 by definition, which is Fib(1)
Fib01(1) = 1 by definition, which is Fib(2)
现在假设Fib01(k) = Fib(k+1)
对于 k < n:
Fib01(n) = Fib01(n-1) + Fib01(n-2)
= Fib(n) + Fib(n-1)
= Fib(n+1) by definition
QED。
推荐阅读
- postgresql - 从 postgresql 中提取月份和年份
- c++ - 为什么虚幻引擎中的变量为空?
- java - 运行第一个 JavaFX 模块化程序时出现异常
- r - 水的问题。自动机器学习。意外的 CURL 错误:getaddrinfo() 线程无法启动
- amazon-web-services - 在 lambda@edge 重写请求云不满足
- javascript - Jquery laravel中带有特殊字符的URL参数
- python - 我想检查产品是否存在于购物车中,然后使用 django 和 jinja 在网页中显示添加的图标
- python-3.x - 在 Python 3x 中将 for 循环转换为 while 循环
- python - 在我的简单 Python 物理引擎中建模摩擦
- c - c语言中两个字符串相减的问题