首先写出 double
和 halve
两个辅助函数,其中 double
求出一个数的两倍,而 halve
则将一个数除以 2 :
;;; 17-double-and-halve.scm
(define (double n)
(+ n n))
(define (halve n)
(/ n 2))
然后利用类似书本 30 页的 fast-expt
的技术,写出使用对数步数求乘积的函数(为了和内置的 *
函数区分开,函数使用 multi
作为名字):
;;; 17-multi.scm
(load "17-double-and-halve.scm")
(define (multi a b)
(cond ((= b 0)
0)
((even? b)
(double (multi a (halve b))))
((odd? b)
(+ a (multi a (- b 1))))))
测试 double
和 halve
:
1 ]=> (load "17-double-and-halve.scm")
;Loading "17-double-and-halve.scm"... done
;Value: halve
1 ]=> (double 2)
;Value: 4
1 ]=> (double 3)
;Value: 6
1 ]=> (halve 6)
;Value: 3
1 ]=> (halve 20)
;Value: 10
测试 multi
:
1 ]=> (load "17-multi.scm")
;Loading "17-multi.scm"...
; Loading "17-double-and-halve.scm"... done
;... done
;Value: multi
1 ]=> (multi 2 4)
;Value: 8
1 ]=> (multi 3 3)
;Value: 9