我有一个关于 Clojure 的问题:我正在尝试通过Project Euler来学习该语言,但我不明白幕后发生了什么:以下代码旨在使用返回所有素数列表,直到lim
. 我认为它在堆空间中应该是 O(n),因为我列出了所有直到 的数字lim
,然后将它们一个一个过滤掉,同时将第一个数字移到一个新列表中。(我知道我实际上每次都在制作新列表,但我认为它们不会占用更多内存?)无论如何我正在运行这个
(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
当我打电话时,我一直在用完堆空间
(apply + (getAllPrimes 2000000))
,但我没有用完空间
(apply + (filter even? (range 2000000)))
所以我认为我一定不明白列表是如何在 recur 调用中被垃圾收集的,并且实际上正在使用 O(n*n) 堆或其他东西。