我目前正在使用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)
使用+'
而不是+
自动提升大型整数
(reduce +'
(filter even?
(take n (map first (iterate (fn [[x y]] [y (+' x y)]) [0 1])))))
Run Code Online (Sandbox Code Playgroud)
默认情况下,Cloujure使用longs并将溢出视为错误.在语言的自动推广的最早期是默认的,直到它被普遍认为四溢长几乎总是除了在人明确地知道他们想要它,所以它被改变的情况下,错误和+'
,*'
和-'
运营商那里添加了人们明确选择它们的情况
归档时间: |
|
查看次数: |
139 次 |
最近记录: |