Tengo una calculadora de número primo simple en clojure (un algoritmo ineficiente, pero estoy tratando de entender el comportamiento de recurrir por ahora). El código es:Desbordamiento al utilizar recur en clojure
(defn divisible [x,y] (= 0 (mod x y)))
(defn naive-primes [primes candidates]
(if (seq candidates)
(recur (conj primes (first candidates))
(remove (fn [x] (divisible x (first candidates))) candidates))
primes)
)
Esto funciona siempre que no intente encontrar demasiados números. Por ejemplo
(print (sort (naive-primes [] (range 2 2000))))
funciona. Para cualquier cosa que requiera más recursividad, recibo un error de desbordamiento.
(print (sort (naive-primes [] (range 2 20000))))
no funcionará. En general, si uso recurrir o llamar a primos ingenuos de nuevo sin el intento de TCO no parece hacer ninguna diferencia. ¿Por qué recibo errores para grandes recursiones mientras uso recurre?
¿Se requiere repetición de bucle para obtener recursividad de cola? No veo el bucle en tu código. Haría esta una respuesta, pero todavía estoy aprendiendo Clojure. – octopusgrabbus
Tu código funciona para mí en Clojure 1.2.1 y 1.3. El único error que finalmente obtengo es un 'OutOfMemoryError' al encontrar números primos de hasta 200,000. –
@octopusgrabbus, no, recur puede usarse de esta manera (solo dentro de un cuerpo de función) también. Ver http://clojure.org/special_forms#recur. –