2

Clojure と Python の両方で同じ方法で再帰関数を定義します。

;;;Clojure:
(defn factorial [n]
  (if (< n 1)
    1
    (* n (factorial (- n 1)))))

#Python:
def factorial(n):
    if n<1:
        return 1
    else:
    return n*factorial(n-1)

Python で factorial(200) を実行すると、次のようになります。

788657867364790503552363213932185062295135977687173263294742533244359449963403342920304284011984623904177212138919638830257642790242637105061926624952829931113462857270763317237396988943922445621451664240254033291864131227428294853277524242407573903240321257405579568660226031904170324062351700858796178922222789623703897374720000000000000000000000000000000000000000000000000L

Clojure では次のようになります。

ArithmeticException integer overflow  clojure.lang.Numbers.throwIntOverflow (Numbers.java:1388)

Python がこの関数を喜んで処理するときに、JVM 上の Clojure がこのような整数オーバーフローを引き起こしているのは何ですか? 私はこの問題を読んだことがありますが、Python は使用可能なメモリによってのみ制限される long 整数を生成できるのに対し、Clojure は生成できないという事実に関連しているようです。

4

1 に答える 1

7

デフォルトでは、Clojure は JVM Long を使用して整数を表すため、範囲は -2^63 から 2^(63-1) です。

Clojure で任意の精度を使用するには、特定の演算子の+'*'-'inc'およびdec'バージョンを使用できます。

于 2013-07-01T16:06:22.213 に答える