练习 1.17

首先写出 doublehalve 两个辅助函数,其中 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))))))

测试 doublehalve :

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

讨论

blog comments powered by Disqus