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 可以产生仅受可用内存限制的长整数这一事实有关,而我猜 Clojure 不能——但我希望能更详细地了解正在发生的事情。

4

1 回答 1

7

默认情况下,Clojure 使用 JVM Longs 来表示整数,因此范围是从 -2^63 到 2^(63-1)。

为了在 Clojure 中使用任意精度,您可以使用给定运算符的+'*'-'inc'dec'版本。

于 2013-07-01T16:06:22.213 回答