Ich versuche, eine einfache Siebfunktion zu schreiben, um Primzahlen in Clojure zu berechnen. Ich habe this Frage über das Schreiben einer effizienten Siebfunktion gesehen, aber ich bin zu diesem Punkt noch nicht. Im Moment versuche ich nur ein sehr einfaches (und langsames) Sieb zu schreiben. Hier ist, was ich habe kommen mit:Rekursive Funktion verursacht einen Stapelüberlauf
(defn sieve [potentials primes]
(if-let [p (first potentials)]
(recur (filter #(not= (mod % p) 0) potentials) (conj primes p))
primes))
Für kleine Bereiche es funktioniert gut, aber verursacht einen Stapelüberlauf für große Bereiche:
user=> (sieve (range 2 30) [])
[2 3 5 7 11 13 17 19 23 29]
user=> (sieve (range 2 15000) [])
java.lang.StackOverflowError (NO_SOURCE_FILE:0)
Ich dachte, dass recur
unter Verwendung dieses ein nicht wäre -stackverzehrendes Looping-Konstrukt? Was vermisse ich?
+1 für Stapelüberlauf im Titel Ihrer Frage – radman
Lustig; funktioniert bei mir. Welche Version von Clojure benutzt du, mit welcher JVM, auf welcher Plattform? Können Sie '' (Bereich 2 15000) 'ohne Überlauf ausführen? –
Ubuntu 9.10, Java 1.6.0_15, letzter Schnappschuss von Clojure 1.2.0 – dbyrne