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