我在 Clojure 中实现了埃拉托斯特尼筛法:
(defn sieve [n]
(loop [last-tried 2 sift (range 2 (inc n))]
(if
(or (nil? last-tried) (> last-tried n))
sift
(let [filtered (filter #(or (= % last-tried) (< 0 (rem % last-tried))) sift)]
(let [next-to-try (first (filter #(> % last-tried) filtered))]
(recur next-to-try filtered))))))
对于较大的n
(如 20000)它以堆栈溢出结束。为什么尾调用消除在这里不起作用?如何修复它?
问题:filter
进行惰性评估,因此每个新级别的过滤都会挂在调用堆栈上。
修正:改变(filter ...)
to (doall (filter ...))
.
看解释here.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)