Я изучаю Clojure, просматривая проект Эйлера, и работаю над проблемой номер 10 (найти сумму всех простых чисел меньше двух миллионов. Я реализовал довольно буквальный алгоритм для сита эратосфенов, но он работает слишком медленно, чтобы быть полезным до 2 млн. Я попытался реализовать его с помощью 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))