【发布时间】:2013-09-30 03:07:27
【问题描述】:
(define (even x) (= (modulo x 2) 0))
(define (twice x) (* x 2))
(define (half x) (/ x 2))
(define (rfmult a b)
(cond ((= 0 a) 0)
((= 0 b) 0)
((even a) (twice (rfmult (half a) b)))
(else (+ b (twice (rfmult (half (- a 1)) b))))))
我了解到(rfmult 3 4) 被调用,else 语句被触发,然后(- 3 1) 代替a 并被切成两半,因此它变为(rfmult 1 4)。在这一点上,我迷路了,因为如果它乘以 2,它就永远不会结束。我只是似乎无法在脑海中理解它。
【问题讨论】:
-
它是一种基于乘法分配性质的算法。对于两个数字 a 和 b,其中 c 是 1/2 a (2c = a),则 ab 等于 2cb,但也等于 2*(cb)。对于任何 ab,其中 d 比 a (d = a - 1) 小一,则 ab = a + (d * b)。请注意,编写的函数仅适用于整数。只需通过替代模型运行即可。 (rfmult 3 4) 变成 (+ 4 (twice (rfmult (half (- 3 1)) 4)) 简单地变成 (+ 4 ( (rfmult 1 4) 2)) 然后 (+ 4 (* ( + 4 (rfmult (half (- 1 1) 4)) 2)) 到 (+ 4 (* ( + 4 (rfmult 0 4)) 2)) 到 (+ 4 (* ( + 4 0)) 2) ) t0 (+ 4 (* 4 2)) 到 (+ 8 4) 到 12