65 lines
1.2 KiB
Plaintext
65 lines
1.2 KiB
Plaintext
(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)))
|