SICP Exercise 1.18

연습문제 1.18: 연습문제 1.16과 1.17에서
얻은 결과를 바탕으로, 계산 단계가 로그 비례로 자라나는 반복 프로세스가 되도록
곱셈 프로시저를 작성하라. (러시아 농사꾼 방식 Russian peasent method)

1.16 풀이 때 빠진 저기압에서 빠져나오기 위해, 이번에는 열심히 머리를 굴렸다.
아들과 놀아줄 때도, 밥 먹을 때도, 영어 시험 준비할 때도, 전철 타고 가는
중에도... (-_-)

결국 풀었다! 다른 사람들은 다 하는 것이지만, 안돌아가는 머리 굴리게 만드는
것 자체가 칭찬받아 마땅한 것이다.

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

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

(defn fast-mul-iter [a n p]
  (cond
   (= n 0) p
   (even? n) (fast-mul-iter (twice a) (halve n) p)
   :else     (fast-mul-iter a (dec n) (+ p a))))

(defn fast-mul [a b]
  (fast-mul-iter a b 0))

n이 짝수나 아니냐 조건 비교 다음에 함수를 호출해줄 때 어떻게 인수를
갱신하여 넣는가 하는 것이 관건이더라.