SICP习题1.19要求用对数步数求斐波那契数,有关斐波那契数我们在习题1.13 中讨论过,书中1.2.2节也详细讲解了斐波那契数的求法。在1.2.2节中讲述了斐波那契数的递归求法和迭代求法,其中递归求法的步数为Fib(n),而迭代求法的步数相对于n是线性的。虽然迭代求法的步数已经很少了,但是我们可以通过一种方法将步数减少为对数步数,其中的关键就是前面习题中提到的,将两个连续变换转换成一次变换的方法。
在迭代求法中,关键是以下变换:
求出Fib(0),令其为b1
求出Fib(1),令其为a1
按斐波那契数定义,那么a1+b1就是Fib(2)
接着,令b2等于a1, a2等于a1+b1,那么a2+b2就是Fib(3)
如此一直变换,就可以通过a(n-1)+b(n-1)求出Fib(n)。
现在的关键就是找出将以上变换中的连续两次变换转换成一次变换的方法。
首先声明,这个让我自己想是打破脑袋都想不出来的,我是按书中题目的提示来的。
首先按我们总结的,
有等式1:
b2=a1
a2=a1+b1
接着按书上的提示,用等式2表达等式1:
等式2:
b2=b1p+a1q
a2=b1q+a1q+a1p
按等式2可以得到:
等式3:
b3=b2p+a2q
a3=b2q+a2q+a2p
将等式2代入等式3,有:
b3 = b2p+a2q = (b1p+a1q)p+(b1q+a1q+a1p)q
=>b3 = b1pp + a1qp + b1qq + a1qq + a1pq
=>b3= b1(pp + qq) + a1 (qp + qq + pq)
=>b3= b1 (pp + qq) + a1 (qq + 2pq)
a3 = b2q+a2q+a2p = (b1p+a1q)q+(b1q+a1q+a1p)q+(b1q+a1q+a1p)p
=> a3= b1pq + a1qq + b1qq + a1qq + a1pq + b1qp + a1qp + a1pp
=> a3= b1 (pq + qq + qp) + a1(qq + qq +pq+ qp + pp)
=> a3= b1 (pq + qq + pq) + a1(qq + pp) + a1 (qq + pq + qp)
=> a3=b1(qq+2pq) + a1(qq + pp) + a1(qq +2pq)
令p2= (pp + qq) q2=(qq + 2pq)
则有:
b3=b1p2 + a1 q2
a3=b1q2 + a1 p2 + a1q2
所以p2= (pp + qq) q2=(qq + 2pq)是题解
将以上公式转换为代码填入题目准备好的过程主体,结果如下:
(define (fib-iter a b p q count)
(cond ((= count 0) b)
((even? count)
(fib-iter a
b
(+ (* p p) (* q q))
(+ (* q q) (* 2 q p))
(/ count 2)))
(else (fib-iter (+ (* b q) (* a q) (* a p))
(+ (* b p) (* a q))
p
q
(- count 1)))))
分享到:
相关推荐
SICP 习题答案 计算机程序的构造和解释 1-3章 习题答案
SICP习题解答,主要第一章的内容习题答案
NULL 博文链接:https://pengpeng.iteye.com/blog/1344689
SICP 解题集
sicp in python 中文版 sicp in python 中文版 sicp in python 中文版 !!!download>>>https://github.com/wizardforcel/sicp-py-zh
SICP中文第二版SICP中文第二版SICP中文第二版SICP中文第二版SICP中文第二版
SICP-Python版本
SICP 使用的scheme解释器 以前叫DrScheme
sicp 2.2.4节图形语言的racket程序包,配置路径,C:\Users\Administrator\AppData\Roaming\Racket
Python SICP epub版本,很适合学习抽象的思想,用Python版本比lisp更实用
SICP CHINESE ENGLISH THE SECOND EDITION SICP CHINESE ENGLISH THE SECOND EDITION
sicp in python 中文版 sicp in python 中文版 sicp in python 中文版 download : https://github.com/wizardforcel/sicp-py-zh
资源来自pypi官网。 资源全名:sicp-0.0.1b102.dev4.tar.gz
sicp 2ed高清pdf,以及相对应的mit课程资料及习题答案打包,中文版的视频在这里http://i.youku.com/i/UNTcxODk3ODQw/videos?spm=a2hzp.8244740.0.0
SICP 解题集《计算机程序的构造和解释》练习题解集。安装 MIT/GNU Scheme(macOS)下载:下载后运行 .dmg 文件,把 MIT/GNU Scheme.app 拖入 Applications 文件夹在 Applications/应用程序 文件夹中找到 MIT/GNU ...
sicp-in-python(中文版+英文版)PDF 背景. SICP 全称Structure and Interpretation of Computer Programs,翻译过来叫《计算机程序的构造和解释》使用python
资源名称:sicp 和 操作系统:精髓与设计原理第七版资源截图: 资源太大,传百度网盘了,链接在附件中,有需要的同学自取。
经典书籍《计算机程序的构造与解释》,UCB热门课程CS61a的官方教材
#SICP SICP解决方案