フィボナッチ数列

(defn fib
  ([] (concat [0 1] (fib 0 1)))
  ([a b]
    (lazy-seq (cons (+ a b) (fib b (+ a b))))))
(println (take 20 (fib)))


(def fib-seq
  ((fn rfib [a b]
     (lazy-seq (cons a (rfib b (+ a b))))) 0 1))
(println (take 20 fib-seq))

lazy-seq が ポイント。無限のフィボナッチ数列を定義して、takeで任意の長さ分だけ取り出している。

無限の再帰呼び出しで、処理が返ってこなくなることはない。