(defn fib [n] (letfn [(fib* [n] (if (zero? n) [0 1] (let [[a b] (fib* (quot n 2)) c (*' a (-' (*' 2 b) a)) d (+' (*' b b) (*' a a))] (if (even? n) [c d] [d (+' c d)]))))] (first (fib* n))))