Я пытаюсь написать простую ситовую функцию для вычисления простых чисел в clojure. Я видел этот вопрос о написании эффективной ситовой функции, но я пока этого не делаю. Прямо сейчас я просто пытаюсь написать очень простое (и медленное) сито. Вот что я придумал:
(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
это будет нециклическая конструкция цикла? Что мне не хватает?