(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),那么a * b等于2c * b,但也是2 *(c * b)。而且对于任何a * b,其中d是小于a(d = a - 1)的一个,则a * b = a +(d * b)。请注意,写入的函数仅适用于整数。只需通过替代模型运行。 (+ 4(*(rfmult 1 4)2)),然后(+ 4(*(+ 4) (+ 4(*(+ 4(rfmult 0 4))2))到(+ 4(*(+ 4 0))2))t0(rfmult + 4(* 4 2))至(+ 8 4)至12 – WorBlux