Clojure整数溢出使用reduce函数

时间:2014-12-30 23:22:59

标签: clojure

我目前正在使用Clojure处理项目euler问题。第二个问题要求您将前4000000个斐波那契数字相加。不幸的是,我的代码给了我一个Integer Overflow异常。

(defn even-fib-sum [n]
   (reduce + 
      (filter even? 
         (take n (map first (iterate (fn [[x y]] [y (+ x y)]) [0 1]))))))

当我调用函数并传递值4000000

时,会出现问题
(even-fib-sum 4000000) -> throws exception

(even-fib-sum 40) -> 82790070 

1 个答案:

答案 0 :(得分:7)

使用+'代替+来自动提升对bigintegers的添加

(reduce +' 
   (filter even? 
     (take n (map first (iterate (fn [[x y]] [y (+' x y)]) [0 1])))))

Cloujure默认使用long并将overflow作为错误处理。语言自动升级的最初阶段是默认值,直到人们普遍认为溢出长时间几乎总是一个bug,除非在人们明确知道他们想要它的情况下它被改变了+'*'-'运算符是为人们明确选择的情况添加的