下面是代碼:如何使這個篩功能懶惰?
;; Helper function for marking mutiples of a number as 0
(defn mark
([xs k m] (mark xs k m []))
([xs k m mark-vec]
(loop [[x & rest-xs] xs
k k
mark-vec mark-vec
]
(cond
(and (nil? x) (nil? rest-xs)) mark-vec
(= k m) (recur rest-xs 1 (conj mark-vec 0))
:else (recur rest-xs (inc k) (conj mark-vec x))
))))
;; Sieve of Eratosthenes
(defn sieve
([xs] (sieve xs []))
([xs sieve-res]
(loop [[x & rest-xs] xs
sieve-res sieve-res]
(cond
(and (nil? x) (nil? rest-xs)) sieve-res
(= x 0) (recur rest-xs sieve-res)
:else (recur (mark rest-xs 1 x) (conj sieve-res x))))))
(take 10 (sieve (range 2 100)))
我想使它收到類似(iterate inc 2)
並生成素數的無限序列。
http://stackoverflow.com/a/29705514/2472391 – galdre