Learning/SICP/exercise_1_19.janet
2025-05-29 22:00:25 +02:00

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)))