我想編寫一個簡單的篩功能來計算clojure中的素數。我看過this關於編寫一個有效的篩選函數的問題,但我還沒有到那一點。現在我只是想寫一個非常簡單(和慢)的篩子。以下是我想出了:導致堆棧溢出的遞歸函數
(defn sieve [potentials primes]
(if-let [p (first potentials)]
(recur (filter #(not= (mod % p) 0) potentials) (conj primes p))
primes))
對於它工作正常很小的範圍內,但會導致對大範圍的堆棧溢出:
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)
我認爲,通過使用recur
這將是一個非 - 堆棧消耗循環結構?我錯過了什麼?
+1在您的問題的標題中出現堆棧溢出 – radman 2010-06-01 01:12:36
有趣;爲我工作。你在什麼平臺上使用什麼版本的Clojure,以及哪些JVM?你可以運行'(範圍2 15000)'沒有溢出嗎? – 2010-06-01 01:17:55
Ubuntu 9.10,Java 1.6.0_15,Clojure的最新快照1.2.0 – dbyrne 2010-06-01 01:30:12