Clojure: Evitando o estouro de pilha na Peneira de Erathosthene?
Aqui está minha implementação do Sieve of Erathosthene in Clojure (com base na lição do SICP sobre fluxos):
(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)))
Agora, tudo bem quando tomo as primeiras 100 primas:
(take 100 primes)
Mas, se eu tentar tirarprimeiros 1000 primos, quebras de programa devido ao estouro de pilha. Gostaria de saber se é possível alterar de alguma forma a peneira de função para se tornar recursivo da cauda e, ainda assim, preservar "fluxos" de algoritmo?
Qualquer ajuda???