我在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不能 - 但我会更加详细地了解正在发生的事情。
答案 0 :(得分:7)
默认情况下,Clojure使用JVM Longs来表示整数,因此范围从-2 ^ 63到2 ^(63-1)。
为了在Clojure中使用任意精度,您可以使用给定的+'
,*'
,-'
,inc'
和dec'
版本运算符。