(5am:test exercise-1.16
(5am:is (= 1 (fast-expt 2 0)))
(5am:is (= 2 (fast-expt 2 1)))
(5am:is (= 8 (fast-expt 2 3)))
(5am:is (= (* 2 (fast-expt 2 9))
(fast-expt 2 10))))
(defun square (x)
(* x x))
(defun fast-expt-iter (b n a)
(cond ((zerop n) a)
((evenp n) (fast-expt-iter (square b) (/ n 2) a))
(t (fast-expt-iter b (1- n) (* a b)))))
(defun fast-expt (b n)
(fast-expt-iter b n 1))
squareは別に定義しなくても良かったけど、再帰的アルゴリズムに合わせて。トレースすると、bが大きくなっていくのは面白い。
返信削除