(defn expt [b n] (if (= n 0) 1 (* b (expt b (- n 1))))) (defn expt2 [b n] (defn expt-iter [b n s] (if (= n 0) s (expt-iter b (- n 1) (* s b)))) (expt-iter b n 1)) (defn fast-expt [b n] (defn even? [n] (= (mod n 2) 0)) (defn square [n] (* n n)) (defn expt-iter [b n s] (cond (= n 0) s (even? n) (square (expt-iter b (/ n 2) s)) (* b (expt-iter b (- n 1) s)))) (expt-iter b n 1)) (defn fast-expt2 [b n] (defn even? [n] (= (mod n 2) 0)) (defn square [n] (* n n)) (defn expt-iter [b n s] (cond (= n 0) s (even? n) (expt-iter (square b) (/ n 2) s) (expt-iter b (- n 1) (* b s)))) (expt-iter b n 1)) (defn count-fast-expt2 [b n] (var counter 0) (defn even? [n] (= (mod n 2) 0)) (defn square [n] (* n n)) (defn expt-iter [b n s] (set counter (+ counter 1)) (cond (= n 0) s (even? n) (expt-iter (square b) (/ n 2) s) (expt-iter b (- n 1) (* b s)))) (expt-iter b n 1) counter) # case 1 (n mod 2 = 0): # f(b,n) = f(b,n/2)^2 # case 2 (n mod 2 = 1): # f(b,n) = f(b,n-1)*b # iterative approach: # case 1 (n mod 2 = 0): # f(b,n) = f(b^2, n/2) # case 2 (n mod 2 = 1): # f(b,n) = f(b, n-1)*b # examples: # n = 1 # f(b,1) = f(b,0)*b = 1 * b = b # n = 2 # f(b,2) = f(b^2,1) = 1 * b^2 = b^2 # n = 3 # f(b,3) = f(b,2)*b = f(b^2, 1) * b = b * b^2 = b^3 # n = 4 # f(b,4) = f(b^2,2) = f(b^4, 1) = 1 * b^4 = b^4 # n = 5 # f(b,5) = f(b,4)*b = f(b^4, 1) = b * b^5 = b^5 (def k 100000) (defn lo [n] (cond (= n k) (printf "%d,%d" n (count-fast-expt2 0.99 n)) (do (printf "%d,%d" n (count-fast-expt2 0.99 n)) (lo (+ n 1))))) (lo 0)