递归函数(factorial)使用IntOverflow而不是Python来破坏Clojure

时间:2013-07-01 15:47:04

标签: python clojure

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

1 个答案:

答案 0 :(得分:7)

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

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