que tiene esta aplicación de la criba de Eratóstenes en Clojure:Clojure - criba de Eratóstenes recursiva cola
(defn sieve [n]
(loop [last-tried 2 sift (range 2 (inc n))]
(if
(or (nil? last-tried) (> last-tried n))
sift
(let [filtered (filter #(or (= % last-tried) (< 0 (rem % last-tried))) sift)]
(let [next-to-try (first (filter #(> % last-tried) filtered))]
(recur next-to-try filtered))))))
Para mayor n
(como 20000) termina con desbordamiento de pila. ¿Por qué la cola no funciona aquí? ¿Como arreglarlo?
Como nota al margen, pero este no es el tamiz de Eratóstenes. SoE no realiza operaciones de resto, solo suma y "tachando". Vea http://www.cs.hmc.edu/~oneill/papers/Sieve-JFP.pdf para una discusión extensa (¡es una gran lectura!); para una hermosa implementación de SoE "incremental" en Clojure por Christophe Grand, ver http://clj-me.cgrand.net/2009/07/30/everybody-loves-the-sieve-of-eratosthenes/ (también es el más rápido) versión que he visto hasta ahora). –
@ Michał Marczyk gracias. Yo diría que "tachar" es equivalente a "filtrado", y "adición" en este algoritmo es equivalente a "multiplicación" y, en consecuencia, "resto". –
No realmente. El resultado es, por supuesto, el mismo, pero la complejidad algorítmica es tremendamente diferente. –