Clojure: Vermeiden eines Stapelüberlaufs im Sieb von Erathosthen?
Hier ist meine Implementierung von Sieve of Erathosthene in Clojure (basierend auf der SICP-Lektion für Streams):
(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)))
Jetzt ist alles in Ordnung, wenn ich die ersten 100 Primzahlen nehme:
(take 100 primes)
Aber wenn ich versuche, @ zu nehmrste 1000 Primzahl, Programm bricht wegen Stapelüberlauf ab. Ich frage mich, ob es möglich ist, das Funktionssieb irgendwie so zu ändern, dass es schwanzrekursiv wird und trotzdem die "Streamnes" des Algorithmus zu erhalte
Irgendeine Hilfe??