Clojure整数溢出使用reduce函数

ade*_*sin 4 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]))))))
Run Code Online (Sandbox Code Playgroud)

当我调用函数并传递值4000000时,会出现问题

(even-fib-sum 4000000) -> throws exception

(even-fib-sum 40) -> 82790070 
Run Code Online (Sandbox Code Playgroud)

Art*_*ldt 7

使用+'而不是+自动提升大型整数

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

默认情况下,Cloujure使用longs并将溢出视为错误.在语言的自动推广的最早期是默认的,直到它被普遍认为四溢长几乎总是除了在人明确地知道他们想要它,所以它被改变的情况下,错误和+',*'-'运营商那里添加了人们明确选择它们的情况