SICP学习笔记:求幂,用对数的算法复杂度解决fib数列
来源:互联网 发布:台湾图解gv新域名2017 编辑:程序博客网 时间:2024/05/22 12:51
练习1.16,用来求一个数的幂,线形迭代的过程.讨论了正数和负数的情况
(define (do-expt b n) (cond ((> n 0) (fast-expt b b n)) ((= n 0) 1) (else (/ 1 (fast-expt b b (- 0 n)))) ))(define (even? n)(= (remainder n 2) 0))(define (fast-expt a b n) ( cond ((= n 1) a) ((even? n) (fast-expt (* a a) b (/ n 2))) (else (fast-expt (* a a b) b (/ (- n 1) 2))) ))
还有另外一种思路:不停的记录b的变化,如果n是奇数,就把a-〉a*b然后n->n-1,否则不停的double b的值.
(define (fast-expt b n) (expt-iter b n 1))(define (expt-iter b n a) (cond ((= n 0) a) ((even? n) (expt-iter (square b) (/ n 2) a)) ((odd? n) (expt-iter b (- n 1) (* b a)))))
练习1.17:线型递归的加法:
(define (even? n)(= (remainder n 2) 0))(define (halve a) (/ a 2))(define (double a) (* a 2))(define (fast-multi a b)( cond ((= a 0) 0) ((even? a) (double (fast-multi (halve a) b))) (else (+ b (fast-multi (- a 1) b)))))
练习1.18,线性迭代的加法:
(define (f a b n) ( cond((= b 0) n) ((even? b)(f (double a) (halve b) n)) (else (f a (- b 1) (+ n a)))))(define (fast-multi a b)(f a b 0))
基本思路和1.16如出一辙,用n来代表当前的结果.
练习1.19:
(define (fib a b p q count) (define(cmp_next_p p q)(+ (* p p) (* q q))) (define (cmp_next_q p q)(+ (* q q)(* 2 p q))) (cond((= count 0) b) ((even? count)(fib a b (cmp_next_p p q) (cmp_next_q p q) (halve count))) (else (fib (+ (* b q) (* a q) (* a p)) (+ (* b p) (* a q)) p q (- count 1))) ))( define (f n)(fib 1 0 0 1 n))
证明:
已知对于对偶 (a,b)(a,b) ,有变换 TpqTpq 为 {ab← bq+a(p+q),← bp+aq.{a← bq+a(p+q),b← bp+aq.那么对于 TpqTpq 的平方 (Tpq)2(Tpq)2 来说,有变换 {ab← (bp+aq)q+(bq+a(p+q))(p+q)=b(2pq+q2)+a(p2+q2+2pq+q2),← (bp+aq)p+(bq+a(p+q))q=b(p2+q2)+a(2pq+q2).{a← (bp+aq)q+(bq+a(p+q))(p+q)=b(2pq+q2)+a(p2+q2+2pq+q2),b← (bp+aq)p+(bq+a(p+q))q=b(p2+q2)+a(2pq+q2).通过对比 TpqTpq 和 (Tpq)2(Tpq)2 ,可以得出变换 Tp′q′Tp′q′ ,其中 p′=p2+q2p′=p2+q2 并且 q′=2pq+q2q′=2pq+q2 。
1 0
- SICP学习笔记:求幂,用对数的算法复杂度解决fib数列
- 对数复杂度的聚集算法
- 求数列的逆序数对数问题
- 求逆序对数的一种时间复杂度为nlgn的算法
- 复杂度为nlgn的求幂算法
- 算法时间复杂度-对数阶
- fib数列
- Fib数的算法
- UVA 10689 Yet another Number Sequence(矩阵快速幂求Fib数列)
- 输出fib数列的第20个数
- <算法导论>学习笔记(3)--递归树求递归算法时间复杂度
- 求数列的最大子段和的两种方法(包括时间复杂度为线性时间的算法)
- Fib数列用迭代法时间超限
- 【算法学习】算法的复杂度
- 算法学习之求数列和
- 求复数的对数
- SICP-求幂
- 分治法 求 逆序对数 的个数 时间复杂度为O(n*logn)
- 利用Filter 过滤字符编码的格式
- XP下vs2008-qt4.8.6编译Qgis:qwt编译
- 软件工程感想
- Prim算法
- 【SSH网上商城】Hibernate详解(一)
- SICP学习笔记:求幂,用对数的算法复杂度解决fib数列
- 理解面向对象
- XMPP即时通信的效果图
- AndroidStudio下快速生成Model,如何为Model瘦身
- Android中Activity启动模式学习笔记
- 第一个C语言程序
- JavaScript 实现延迟合并处理任务
- Android开发之滑动效果+页面分支跳转
- FZU 2206 函数求解(找规律)