ウォンツテック

そでやまのーと

久々に問題を解こう。
数日空けると頭が再帰的じゃなくなって問題が意味不明に。。

(define (* a b)
  (define (*-iter x a b)
    (cond ((= b 0) x)
          ((even? b) (*-iter (if (= x 0)
                             (double a)
                             (double x)) a (halve b)))
          (else (*-iter (+ x a) a (- b 1)))))
  (define (even? n)
    (= (remainder n 2) 0))
  (define (double n)
    (* n 2))
  (define (halve n)
    (/ n 2))
  (*-iter 0 a b))

xの初期値を0にするとbが偶数の時に (double x)とやると
0になってしまうので(if (= x 0) (double a) (double x))
としたけど微妙だ。。