对题目进行分析,
反复地做加法,能达到乘积的效果,
值得注意的是在书上写了如下代码
(define (* a b)
(if (= b 0)
0
(+ a (* a (- b 1)))))
第一眼看的时候可能会糊涂,
可是题干上已经说明,
“in which it is assumed that our language can
only add,not multiply”
所以,我们不要把*看成乘号,
只需将他看成一过程名即可,
在这个过程中只要形参b不为0,
就会递归出如下过程:
(+ a (+ a (+ a (…(+ a (- b 1))…))))
这是一个线性递归的过程,
其时间增长的阶和空间增长的阶均为b,
现在要设计一个类似fast-expt的过程,
也就是其增长的阶为对数,
书中提示有两个过程,
分别为能求出一个整数两倍的名为double的过程,
和一个能求出偶数除以2的名为halve的过程,
现在我们要利用题目上给出的条件,
设计出一个类似fast-expt的算法过程,
2021年3月21日19:45
(define fast-mult
(lambda (a b)
(define even?
(lambda (x)
(= (remainder x 2) 0)))
(define double
(lambda (x)
(+ x x)))
(define halve
(lambda (x)
(/ x 2)))
(cond ((or (= a 0)
(= b 0))
0)
(else (if (even? b)
(double (fast-mult a
(halve b)))
(+ a (fast-mult a
(- b 1))))))))