SICP Exercise 1.17

연습문제 1.17: 정수 값을 두 배로 하거나 반으로 나누는 프로시저가
있다고 가정하고, 이 프로시저를 써서 fast-expt 처럼 계산 단계가
로그 비례로 자라나는 곱셈 프로시저를 작성하라.

정수 값을 두 배 또는 반으로 만드는 프로시저는 다음과 같다.

(defn twice [a]
  (* a 2))

(defn halve [a]
  (/ a 2))

재귀 버전을 작성하면 되는 것이므로 조금 더 쉽게 작성할 수 있다.
(그래도 약간 머리에 쥐가 나더라는)

(defn fast-mul [a b]
  (cond (= b 0) 0
        (even? b) (twice (fast-mul a (halve b)))
        :else (+ a (fast-mul a (- b 1)))))