Я пытаюсь написать простую ситовую функцию для вычисления простых чисел в clojure. Я видел this вопрос о написании эффективной функции решета, но я пока этого не делаю. Сейчас я просто пытаюсь написать очень простое (и медленное) сито. Вот что я придумал:Рекурсивная функция, вызывающая переполнение стека
(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
это было бы не статическая конструкция цикла? Что мне не хватает?
+1 для переполнения стека в заголовке вашего вопроса – radman
Смешные; работает на меня. Какую версию Clojure вы используете, с какой JVM, на какой платформе? Можете ли вы запустить '(диапазон 2 15000)' без переполнения? –
Ubuntu 9.10, Java 1.6.0_15, последний снимок Clojure 1.2.0 – dbyrne