(defn fib [n] (defn fib-iter [n a b] (cond (= n 0) b (fib-iter (- n 1) (+ a b) a))) (fib-iter n 1 0)) (defn fib-fast [n] (defn even? [n] (= (mod n 2) 0)) (defn square [n] (* n n)) (defn fib-iter [a b p q n] (cond (= n 0) b (even? n) (fib-iter a b (+ (square p) (square q)) (+ (* 2 p q) (square q)) (/ n 2)) (fib-iter (+ (* b q) (* a q) (* a p)) (+ (* b p) (* a q)) p q (- n 1)))) (fib-iter 1 0 0 1 n)) (defn count-fib [n] (var c 0) (defn fib-iter [n a b] (set c (+ c 1)) (cond (= n 0) b (fib-iter (- n 1) (+ a b) a))) (fib-iter n 1 0) c) (defn count-fib-fast [n] (defn even? [n] (= (mod n 2) 0)) (defn square [n] (* n n)) (var c 0) (defn fib-iter [a b p q n] (set c (+ 1 c)) (cond (= n 0) b (even? n) (fib-iter a b (+ (square p) (square q)) (+ (* 2 p q) (square q)) (/ n 2)) (fib-iter (+ (* b q) (* a q) (* a p)) (+ (* b p) (* a q)) p q (- n 1)))) (fib-iter 1 0 0 1 n) c) (var k 0) (while (< k 100000) (printf "%d,%d,%d" (+ k 1) (count-fib k) (count-fib-fast k)) (set k (+ k 1)))