私は単純な素数計算をclojureで行っています(非効率的なアルゴリズムですが、今は再帰の動作を理解しようとしています)。コードは次のとおりです。clojureで再帰を使用している間にオーバーフローする
(defn divisible [x,y] (= 0 (mod x y)))
(defn naive-primes [primes candidates]
(if (seq candidates)
(recur (conj primes (first candidates))
(remove (fn [x] (divisible x (first candidates))) candidates))
primes)
)
これは、限り、私はあまりにも多くの数字を見つけようとしていない午前として動作します。例えば、
(print (sort (naive-primes [] (range 2 2000))))
作品です。より多くの再帰を必要とするものについては、オーバーフローエラーが発生します。
(print (sort (naive-primes [] (range 2 20000))))
は機能しません。一般的に、私が再帰を使うか、TCOで試みることなくナイーブ素数をもう一度呼び出すかは、何の違いもないようです。再帰を使用しているときに大きな再帰でエラーが発生するのはなぜですか?
テール再帰を取得するには、ループが必要ですか?私はあなたのコードにループが表示されません。私はこれを答えるだろうが、私はまだClojureを学んでいる。 – octopusgrabbus
あなたのコードは、Clojure 1.2.1と1.3で私に役立ちます。私が最終的に得る唯一のエラーは、200000までの素数を見つけるときに 'OutOfMemoryError'です。 –
@octopusgrabbus、no、recurはこのように(関数本体の中で)使用することもできます。 http://clojure.org/special_forms#recurを参照してください。 –