4clojure #62 Re-implement Iterate

4clojure #62 Re-implement Iterate

関数fと初期値xをとり、 無限な遅延シーケンスx, (f x), (f (f x)), (f (f (f x)))...を返す関数を作る。

iterateは使用禁止。

(= (take 5 (__ #(* 2 %) 1)) [1 2 4 8 16])
(= (take 100 (__ inc 0)) (take 100 (range)))
(= (take 9 (__ #(inc (mod % 3)) 1)) (take 9 (cycle [1 2 3])))

定義を丸パクリ

(take 5 ((fn it [f x] (cons x (lazy-seq (it f (f x))))) #(* 2 %) 1))

参考 iterateの定義

(defn iterate
  "Returns a lazy sequence of x, (f x), (f (f x)) etc. f must be free of side-effects"
  {:added "1.0"
   :static true}
  [f x] (cons x (lazy-seq (iterate f (f x)))))