这是我在Clojure中实现的Erathosthene筛选(基于关于流的SICP课程):
(defn nats-from [n]
(iterate inc n))
(defn divide? [p q]
(zero? (rem q p)))
(defn sieve [stream]
(lazy-seq (cons (first stream)
(sieve (remove #(divide? (first stream) %)
(rest stream))))))
(def primes (sieve (nats-from 2)))
Run Code Online (Sandbox Code Playgroud)
现在,当我拿到前100个素数时,一切都好了:
(take 100 primes)
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试采用前1000个素数,因为堆栈溢出而导致程序中断.我想知道是否有可能改变某种功能筛选成尾递归,并且仍然保留算法的"流"?
任何帮助???