2014-12-30 48 views
4

我目前正在審閱使用Clojure的項目歐拉問題。第二個問題要求你總結第一批400萬斐波那契數。不幸的是我的代碼給了我一個整數溢出異常。Clojure整數溢出使用減少功能

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

當我打電話的功能和傳遞價值400萬

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

(even-fib-sum 40) -> 82790070 

回答

7

使用+'代替+得到自動促進除了bigintegers

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

Cloujure通過使用多頭出現的問題默認並將溢出視爲錯誤。在語言的早期階段,自動推廣是默認的,直到人們普遍認爲長滿溢幾乎總是一個錯誤,除非人們明確知道他們想要它,所以它被改變了,並且+',*'-'運營商,其中添加的情況下,人們明確選擇它們

+0

我相信'+''應該用在函數的最後一行;否則它在'(even-fib-sum 93)'上溢出。 –

+0

是的,這是正確的。謝謝@BobJarvis – adebesin

+0

感謝您解決這個問題 –