SICP 习题 ( 1.17) 解题总结
来源:互联网 发布:纯js省市区三级联动 编辑:程序博客网 时间:2024/04/29 12:18
SICP习题 1.17 是将一个计算加法的过程修改成一个只使用对数计算步数的方法。
其实这个习题是对书中对数步数求幂方法的强调,对数步数求幂的方法是将一系列的乘法变成对数步数的求幂。本习题就是要求将一系列的加法变成对数步数的乘法。
需要转换的过程如下:
(define (* a b) (if (= b 0) 0 (+ a (* a (- b 1)))))
我们要做的就是对b进行判断,如果是偶数,就将a*b变成(double a*(halve b))
如果b是奇数,就将a*b变成 (a + a * (b -1))
你会发现这个过程和书上的对数步数求幂几乎一模一样,过程定义如下:
(define (fast-mul a b) (cond ((= b 0) 0)((even? b) (double (fast-mul a (halve b ))))(else (+ a (fast-mul a (- b 1))))))
进一步想的话,其实可以对这种“折半”的方法进行抽象,在更高的抽象层面完成所有的这些过程,其中的关键就是找出将连续两次变换变成一次变换的方法。
就好像书中将b*b 变成b的平方,还有本例中b+b 变成 (double b)。
有关这种变换在后面的习题中还会提到,其实本习题的目的应该也是希望大家对这种变换有更深刻的认识。
- SICP 习题 ( 1.17) 解题总结
- SICP 习题 (1.21) 解题总结
- SICP习题 (1.12)解题总结
- SICP 习题 (1.14)解题总结
- SICP 习题 (1.13) 解题总结
- SICP 习题 (1.15) 解题总结
- SICP 习题 (1.16)解题总结
- SICP 习题 (1.18) 解题总结
- SICP 习题 (1.19) 解题总结
- SICP 习题 (1.20) 解题总结
- SICP 习题 (1.22) 解题总结
- SICP 习题 (1.23) 解题总结
- SICP 习题 (1.25) 解题总结
- SICP 习题 (1.24) 解题总结
- SICP 习题 (1.26) 解题总结
- SICP 习题 (1.27) 解题总结
- SICP 习题 (1.28)解题总结
- SICP 习题 (1.29)解题总结
- 老鼠生子问题
- 集合操作类Collections和Arrays,JDK1.5新特性
- 2014年京东校招笔试中的两道java题目
- Quartz调度实践
- 二叉树的最低父节点
- SICP 习题 ( 1.17) 解题总结
- SICP 习题 (1.18) 解题总结
- android笔记--Android基本知识点
- [每日一题] 11gOCP 1z0-052 :2013-09-10 ABOUT ALERTS...............................................A50
- 用LauncherActivity开发启动Activity列表
- SICP 习题 (1.19) 解题总结
- poj1637Sightseeing tour(混合图欧拉回路)
- 01-使用MicroSoft Visual Studio创建项目
- 核心Swing组件(一)