我正在通过项目 euler 学习 clojure,并且正在研究第 10 号问题(找到低于 200 万的所有素数的总和。我为 Eratosthenes 的筛子实现了一个非常字面的算法,但它的工作速度太慢而无法使用高达 200 万。我尝试使用 loop-recur 来实现它,以不创建任何新帧,但这对性能没有太大影响。
(defn find-primes-sum [last-prime nums]
(loop [p last-prime n nums sum 0]
(println p)
(if (empty? n)
sum
(recur (first n) (doall (remove #(zero? (mod % (first n))) n)) (+ sum (first n))))))
(defn sieve-primes-until [limit]
(find-primes-sum 2 (filter odd? (range 2 (inc limit)))))
(println (sieve-primes-until 2000000))