Я пытаюсь написать простую функцию сита для вычисления простых чисел в 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
это будет циклическая конструкция без использования стека? Чего мне не хватает?