J'ai une question à propos de Clojure: J'essaie d'apprendre la langue en passant par Project Euler et je ne comprends pas ce qui se passe sous le capot: Le code suivant est conçu pour utiliser renvoie une liste de tous les nombres premiers jusqu'à lim
. Je pense qu'il devrait être O (n) dans l'espace de tas parce que je fais une liste de tous les nombres jusqu'à lim
, puis les filtre un par un tout en déplaçant le premier à une nouvelle liste. (Je sais que je suis en fait faire de nouveaux listes chaque RECUR mais je ne pensais pas qu'ils prendraient plus de mémoire?) De toute façon je courais cela avecDébutant question à propos de tas et des ordures à 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
Et je continue à manquer d'espace de tas, quand je l'appelle
(apply + (getAllPrimes 2000000))
, mais je ne lance pas d'espace sur
(apply + (filter even? (range 2000000)))
Je pense donc que je ne dois pas comprendre comment les listes sont recueillies dans les ordures appels à se reproduire et je suis réellement en utilisant O (n * n) tas ou quelque chose.
Cette réponse précédemment ici: La réponse courte est que le filtre crée une séquence paresseuse et vous appelez le filtre sur le filtre fini ... et finalement les débordements de pile. Une façon de résoudre cela (comme suggéré par Dreish) est de réaliser la séquence à chaque pas par un «doall». –