(wat-aro)

無職から有職者にランクアップしました

SICP 問題1.17

(define (* a b)
  (if (= b 0)
      0
      (+ a (* a (- b 1)))))

;; 末尾再帰にしてみた
(define (* a b)
  (*iter a b 0))

(define (*iter a b sum)
  (if (= b 0)
      sum
      (*iter a (- b 1) (+ a sum))))

(define (double n)
  (* 2 n))

(define (halve n)
  (/ n 2))


;; fast-exptのように
(define (fast-* n m)
  (cond ((= m 0) 0)
        ((even? m) (double (fast-* n (halve m))))
        (else (+ n (fast-* n (- m 1))))))