SICP 习题 ( 1.17) 解题总结

88 篇文章 30 订阅
74 篇文章 1 订阅

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)。


有关这种变换在后面的习题中还会提到,其实本习题的目的应该也是希望大家对这种变换有更深刻的认识。





评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值