【SICP练习】13 练习1.19
来源:互联网 发布:淘宝号心数怎么升 编辑:程序博客网 时间:2024/05/12 06:41
练习1.19
题目中说道斐波那契数中将变换T的n次方应用于对偶(1,0)而产生出来,而现在将T看作T(pq)中p=0和q=1的特俗情况。因此对于对偶(a,b)来说,a—bq+a(p+q),b—bp+aq。而对于T(pq)的平方也就是(T(pq))^2,就像之前的a中往b乘以q和往a乘以(p+q),现在依旧是相当于a中往bp+aq乘以q(bp+aq为上一次迭代中的”b”),往(bq+a(p+q))中乘以(p+q),同样的变换也发生在b中。依次对于T(pq)的平方来说,a—b(2pq+q*q)+a(p*p+q*q+2*p*q+q*q),b—b(p*p+q*q)+a(2pq+q*q)。
而再次通过对比我们发现p’=p^2+q^2并且q’=2pq+q^2。
所以当N为偶数时,我们又可以通过应用变换T(p’q’)来减少计算T^N的一半计算量,因此在这种情况下就可以写出对数步数的斐波那契函数了。代码如下:
(define(fib n)
(define (fib-iter a b p q n)
(cond ((= n 0) b)
((even? n) (fib-iter a b (+ (squarep) (square q))
(+(* 2 p q) (square q)) (/ n 2)))
((odd? n) (fib-iter (+ (* b q) (* aq) (* a p))
(+ (* b p) (* a q)) p q(- n 1)))))
(fib-iter 1 0 0 1 n))
再来一次测试:
(fib 0)
;Value: 0
(fib 7)
;Value: 13
- 【SICP练习】13 练习1.19
- SICP 练习1.19
- 【SICP练习】2 练习1.6
- 【SICP练习】3 练习1.7
- 【SICP练习】4 练习1.8
- 【SICP练习】5 练习1.9
- 【SICP练习】6 练习1.10
- 【SICP练习】7 练习1.11
- 【SICP练习】8 练习1.12
- 【SICP练习】9 练习1.15
- 【SICP练习】10 练习1.16
- 【SICP练习】11 练习1.17
- 【SICP练习】12 练习1.18
- 【SICP练习】14 练习1.20
- 【SICP练习】15 练习1.21
- 【SICP练习】16 练习1.22
- 【SICP练习】17 练习1.23
- 【SICP练习】18 练习1.24
- 1009. 说反话 (20)
- {Reship}{Sparse Representation}
- Word Break
- erlang&protobuf
- imtophat
- 【SICP练习】13 练习1.19
- mysql+utf8
- 1010. 一元多项式求导 (25)
- Extjs4---常见错误集合
- erlang&c&python&lua递归执行效率
- POJ1062---昂贵的聘礼
- linux下WMB通过ODBC连接DB2数据库
- 无法添加此网站的应用,扩展程序和用户脚本
- erlang分布式调用效率