我正在学习clojure,并且正在学习clojure-koan练习。其中一个练习是关于implementing a factorial function的。我在玩的时候注意到:
我的递归实现似乎适用于大量数据:
(defn factorial-1 [n]
(loop [n n f 1]
(if (= n 1)
f
(recur (dec n) (* f n)))))在REPL中调用(factorial-1 1000N)将产生一个数字:402387260077093773...
然而,当我尝试以下惰性序列方法时:
(defn factorial-2 [n]
(reduce * 1 (range 1 (inc n))))在REPL中调用(factorial-2 1000N)将产生一个错误:
ArithmeticException integer overflow clojure.lang.Numbers.throwIntOverflow (Numbers.java:1388)为什么看似懒惰的序列方法会导致整数溢出错误?
发布于 2015-11-10 01:53:51
或者您可以简单地使用*'函数。
(defn factorial-3 [n]
(reduce *' (range 1 (inc n))))*'函数支持任意精度。如果数字在Long的范围内,它将返回Long。如果范围超过了长期范围,它将返回BigInt。
发布于 2015-11-09 23:17:37
即使超过1000 N,你也不会在乘法中使用任何bigints,因为你只使用这个数字来确定计算的结束。你在1开始乘法,然后乘以1,然后是2,等等。如果您修改factorial-2的定义以使用bigint,您将得到预期的行为:
(defn factorial-2 [n]
(reduce * 1N (range 1 (inc n))))https://stackoverflow.com/questions/33619506
复制相似问题