2012-06-19 64 views
0

我想解決項目歐拉問題在Clojure使用遞歸。以下是問題陳述:解決項目歐拉1

如果我們在下面列出10是3或 5的倍數的所有自然數,我們得到了3,5,6和9這倍數的總和爲23

找到3或5的所有倍數低於1000

總和不過,下面的代碼似乎給出錯誤的答案。我究竟做錯了什麼?

(defn m? 
    [x] 
    (or (= (rem x 3)) (= (rem x 5)))) 

(defn sum-m 
    [limit sum] 
    (if (= limit 0) 
    sum 
    (recur (dec limit) 
      (if (m? limit) 
      (+ sum limit) 
      sum)))) 

(sum-m (dec 1000) 0) 

回答

1

你沒有說這是給什麼錯誤的答案,但我相信這個問題是M +:

(or (= 0 (rem x 3)) (= 0 (rem x 5))) 
0

我想你想要的功能m?檢查一個數是多3或5.但它不這樣做。您應該檢查(rem x 3)或(rem x 5)中的任何一個是否爲零。

這是一個有趣的練習來解決這個非常大的數字。例如,找到10億以下的所有自然數的總和,它們是3或5的倍數。您的解決方案在時間上是線性的,但您可以嘗試更快的解決方案。這不是你原來的問題的一部分;只是一個有趣的補充。

1

m?改爲

(defn m? [x] 
    (or (zero? (rem x 3))(zero? (rem x 5))))