这是我在 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)))
现在,当我取前 100 个素数时,一切正常:
(take 100 primes)
但是,如果我尝试取前 1000 个素数,程序会因为堆栈溢出而中断。我想知道是否有可能以某种方式将函数筛更改为尾递归,并且仍然保留算法的“流”?
有什么帮助???