私はClojureでエラトステネスの篩のこの実装を持っています:
(defn sieve [n]
(loop [last-tried 2 sift (range 2 (inc n))]
(if
(or (nil? last-tried) (> last-tried n))
sift
(let [filtered (filter #(or (= % last-tried) (< 0 (rem % last-tried))) sift)]
(let [next-to-try (first (filter #(> % last-tried) filtered))]
(recur next-to-try filtered))))))
それより大きいn
(20000 など) 場合は、スタック オーバーフローで終了します。ここでテールコールの除去が機能しないのはなぜですか? 修正方法は?