SICP Exercise 1.16

연습문제 1.16: fast-expt처럼 계산 시간이 로그 비례로
늘어나면서 반복 프로세스를 수행하는 거듭제곱 프로시저 작성하기

SICP 공부를 시작하면서 처음으로 자괴감을 느끼게 한 연습문제인데,
문제에 같이 있던 팁도 무슨 이야기인지 이해가 되지 않았다. -_-

머리를 굴려도 해답이 생각나지 않길래 결국 웹 검색으로 컨닝을 할 수
밖에 없었다. 작성자는 '재귀보다 반복 프로세스 작성하기가 어렵다고
하던데 의외로 쉽게 풀었어요'라고 해 내 마음을 더 심란하게 만들었다.

어쨌든 얼른 한 번 휙 보고 새로 작성한 코드.

(defn fast-expt [b n]
  (fast-expt-iter b 1 n))

(defn fast-expt-iter [b a n]
  (cond
    (= n 0) a
    (even? n) (fast-expt-iter (* b b) a (/ n 2))
    :else (fast-expt-iter b (* a b) (dec n))))