Ho una domanda su Clojure: Sto cercando di imparare la lingua passando attraverso Project Euler e non capisco cosa sta succedendo sotto il cofano: Il seguente codice è progettato per utilizzare restituire un elenco di tutti i numeri primi fino a lim
. Penso che dovrebbe essere O (n) nello spazio dell'heap perché faccio una lista di tutti i numeri fino a lim
, e poi li filtra via uno alla volta mentre sposto il primo in un nuovo elenco. (Lo so che sto facendo in realtà nuovi elenchi ogni ripresentarsi, ma non pensavo che avrebbero preso più memoria?) Comunque Sto facendo funzionare questo conDomanda per principianti su heap e spazzatura in Clojure
(defn getAllPrimes [lim]
(defn getPrimes [primes numlist]
(if (not-empty numlist) ;base case;
(recur (cons (first numlist) primes) ;put the prime on to the prime list
(filter
(fn [x] (not (div? x (first numlist)))) ;remove the prime and all its multiples from the numlist
(rest numlist)))
primes)); return the primes
(getPrimes() (range 2 lim))) ;call the recursive function with and empty prime list to be filled up and a full numlist to be emptied
E continuo a corto di spazio di heap, quando chiamo
(apply + (getAllPrimes 2000000))
, ma io non esaurire lo spazio sul
(apply + (filter even? (range 2000000)))
Quindi penso che non devo capire come liste sono spazzatura raccolti nelle chiamate a ripresentarsi e sono in realtà usando O (n * n) heap o qualcosa.
Questa risposta in precedenza qui: La risposta breve è che il filtro crea una sequenza lenta e si chiama filtro su filtro su ... e infine stack overflow. Un modo per risolvere questo problema (come suggerito da Dreish) è quello di realizzare la sequenza ogni passo di un "doall". –