1.18

(load "common.scm")

; 不变量 a, 状态量 c, 计数器 b

; c + ab = c + 2a(b/2)

; c + ab = (c+a) + a(b-1)

(define (fast-multiplied a b)
  (define (mutiplied-iter c a b)
    (cond ((= b 0) c)
          ((even? b) (mutiplied-iter c (double a) (halve b)))
          (else (mutiplied-iter (+ c a) a (- b 1)))
          )
    )
  (mutiplied-iter 0 a b)
  )

(display (fast-multiplied 1 3))
(newline)
(display (fast-multiplied 2 10000000))