【发布时间】:2011-02-26 04:01:44
【问题描述】:
我正在尝试编写一个简单的筛子函数来计算 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 用于在您的问题标题中出现堆栈溢出
-
有趣;为我工作。您在什么平台上使用什么版本的 Clojure,使用什么 JVM?你能在不溢出的情况下运行
(range 2 15000)吗? -
Ubuntu 9.10、Java 1.6.0_15、Clojure 1.2.0 的最新快照
-
是的,我在 15000 处溢出。你能跑一百万而不溢出吗?
-
标题应该是“非递归函数导致堆栈溢出”。
标签: recursion clojure primes lazy-evaluation lazy-sequences