J'essaie d'écrire une fonction simple de tamisage pour calculer les nombres premiers en clojure. J'ai vu ce question sur l'écriture d'une fonction de tamisage efficace, mais je n'en suis pas encore là. Pour l'instant, j'essaie simplement d'écrire un tamis très simple (et lent). Voici ce à quoi j'ai abouti :
(defn sieve [potentials primes]
(if-let [p (first potentials)]
(recur (filter #(not= (mod % p) 0) potentials) (conj primes p))
primes))
Pour les petites plages, cela fonctionne bien, mais provoque un dépassement de pile pour les grandes plages :
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)
Je pensais qu'en utilisant recur
ce serait une construction en boucle qui ne consomme pas de pile ? Qu'est-ce qui m'échappe ?