생성일: 2019년 12월 05일
수정일: 2023년 08월 03일
수정일: 2023년 08월 03일
4clojure - Re-implement Iterate (62)
문제
(= (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])))
제한: iterate
풀이
(fn iter [f x]
(lazy-seq (cons x (iter f (f x)))))
itearate의 동작을 확실하게 알기 때문에 풀기가 그렇게 어렵지는 않았다. 이전에 계산된 값을 사용하는 방식으로 reduce 비스무리하게 동작을 한다고 생각하면 될 것 같다.
눈여겨 볼 부분은 lazy-seq이다. 게으른 연산을 수행을 하는데 값을 원할때까지 계산을 미루는 방식으로 사용 된다.
즉, 필요없는 데이터를 미리 로드 하지 않는다고 생각을 하면 될 것 같다.
Thread last로 변경하면 아래와 같다
(defn iter [f x]
(->> (f x)
(iter f)
(cons x)
(lazy-seq)))