Ho un semplice calcolatore di numeri primi in clojure (un algoritmo inefficiente, ma sto solo cercando di capire il comportamento di recur per ora). Il codice è:Overflow durante l'utilizzo ricorrente in 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)
)
Questo funziona fintanto che non sto cercando di trovare troppi numeri. Ad esempio
(print (sort (naive-primes [] (range 2 2000))))
opere. Per qualsiasi cosa richieda più ricorsione, ottengo un errore di overflow.
(print (sort (naive-primes [] (range 2 20000))))
non funziona. In generale, se ricorrere o chiamare di nuovo i primati naive senza il tentativo di TCO non sembra fare alcuna differenza. Perché ricevo errori per ricorsioni di grandi dimensioni durante l'utilizzo di ricorrenza?
È necessario ripetere il ciclo per ottenere la ricorsione della coda? Non vedo il ciclo nel tuo codice. Farei una risposta, ma sto ancora imparando Clojure. – octopusgrabbus
Il tuo codice funziona per me in Clojure 1.2.1 e 1.3. L'unico errore che ottengo è un 'OutOfMemoryError' quando si trovano i primi fino a 200.000. –
@octopusgrabbus, no, recur può essere usato in questo modo (solo all'interno di un corpo di una funzione). Vedi http://clojure.org/special_forms#recur. –