我目前正在使用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
答案 0 :(得分:7)
使用+'
代替+
来自动提升对bigintegers的添加
(reduce +'
(filter even?
(take n (map first (iterate (fn [[x y]] [y (+' x y)]) [0 1])))))
Cloujure默认使用long并将overflow作为错误处理。语言自动升级的最初阶段是默认值,直到人们普遍认为溢出长时间几乎总是一个bug,除非在人们明确知道他们想要它的情况下它被改变了+'
,*'
和-'
运算符是为人们明确选择的情况添加的