Clojure: Как избежать переполнения стека в Sieve of Erathosthene?
Вот моя реализация Sieve of Erathosthene в Clojure (основанная на уроке 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 простых чисел, программа прерывается из-за переполнения стека. Мне интересно, можно ли как-то изменить функцию sieve, чтобы она стала хвостовой рекурсивной и, тем не менее, чтобы сохранить «поток» алгоритма?
Любая помощь???