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

Mik*_*lla 2 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)
Run Code Online (Sandbox Code Playgroud)

在Python中,如果我运行factorial(200),我得到:

788657867364790503552363213932185062295135977687173263294742533244359449963403342920304284011984623904177212138919638830257642790242637105061926624952829931113462857270763317237396988943922445621451664240254033291864131227428294853277524242407573903240321257405579568660226031904170324062351700858796178922222789623703897374720000000000000000000000000000000000000000000000000L
Run Code Online (Sandbox Code Playgroud)

在Clojure中我得到:

ArithmeticException integer overflow  clojure.lang.Numbers.throwIntOverflow (Numbers.java:1388)
Run Code Online (Sandbox Code Playgroud)

当Python很乐意处理这个函数时,JVM上的Clojure导致这样的整数溢出是什么?我已经阅读了这个问题,似乎与Python相关的事实是,Python可以产生仅受可用内存限制的长整数,而我猜Clojure不能 - 但我会更加详细了解究竟发生了什么.

Jer*_*emy 7

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

为了使用任意精度Clojure中,你可以使用+',*',-',inc',和dec'给定的运营商的版本.