【发布时间】:2015-11-09 22:27:46
【问题描述】:
我正在学习 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)
为什么看似懒惰的序列方法会导致整数溢出错误?
【问题讨论】: