不幸的是,我的代码给了我一个整数溢出异常。
(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
使用
+'
而不是 +
来将自动促销添加到大整数
(reduce +'
(filter even?
(take n (map first (iterate (fn [[x y]] [y (+' x y)]) [0 1])))))
Cloujure 默认使用 long 并将溢出视为错误。在该语言的早期阶段,自动升级是默认设置,直到人们普遍认为溢出 long 几乎总是一个错误,除非人们明确知道他们想要它,所以它被更改了,并且
+'
,添加 *'
和 -'
运算符是为了人们明确选择它们的情况