Estoy tratando de escribir una función de criba simple para calcular los números primos en clojure. He visto this pregunta acerca de cómo escribir una función de tamiz eficiente, pero todavía no estoy en ese punto. En este momento solo intento escribir un tamiz muy simple (y lento). Esto es lo que he llegado con:Función recursiva que causa un desbordamiento de la pila
(defn sieve [potentials primes]
(if-let [p (first potentials)]
(recur (filter #(not= (mod % p) 0) potentials) (conj primes p))
primes))
Para los pequeños rangos funciona bien, pero provoca un desbordamiento de pila para grandes gamas:
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)
pensé que mediante el uso recur
esto sería un no -construcción de bucle de consumo de pila? ¿Qué me estoy perdiendo?
+1 por tener desbordamiento de pila en el título de su pregunta – radman
Divertido; funciona para mi. ¿Qué versión de Clojure estás usando, con qué JVM, en qué plataforma? ¿Puedes ejecutar '(rango 2 15000)' sin desbordamiento? –
Ubuntu 9.10, Java 1.6.0_15, última instantánea de Clojure 1.2.0 – dbyrne