小编nix*_*ixx的帖子

Clojure:避免Erathosthene筛子中的堆栈溢出?

这是我在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个素数,因为堆栈溢出而导致程序中断.我想知道是否有可能改变某种功能筛选成尾递归,并且仍然保留算法的"流"?

任何帮助???

primes tail-recursion clojure sieve-of-eratosthenes

11
推荐指数
1
解决办法
825
查看次数