2017-02-18 79 views
0

我想解決歐拉項目問題1.我已經注意到一個序列導致更快的解決方案,每15號。項目歐拉1太慢與三角數字

這是15 n中的Clojure代碼

(defn fifteenator [n] 
    (* 15 (+ (* (+ 1 n) 3) (* (/ (+ (* n n) n) 2) 7)))) 

是0 30,n爲1等。

所以我可以計算出可以被15整除的最接近的數字,只做幾次遞歸計算。但仍然有一個HackerRank測試用例超時。在我開始分析代碼之前,我想確定我的推理是否正確。有更快的方法來計算它,還是應該學會剖析Clojure?

+1

你有沒有使用[應用]考慮(https://clojuredocs.org/clojure。 core/apply)和[filter](https://clojuredocs.org/clojure.core/filter)呢? – shash678

+0

您可以通過在['time'](https://clojuredocs.org/clojure.core/time)中打包語句來計算評估時間,該語句將標準輸出花費的時間打印出來。 –

+0

一些提示:1.「i」的倍數序列是「(範圍i n i)」,但不包括「n」。 2.你可以使用'(reduce + ...)'或'(apply + ...)'來對一個序列求和。 3.如果你將3的倍數和5的倍數相加,你會將15的倍數計算兩次。使用[算術級數]代數的更快解決方案(https://en.wikipedia.org/wiki/Arithmetic_progression#Sum) – Thumbnail

回答

0

我不確定你的方法。 Clojure對量程和過濾器有很好的支持。有了這些解決歐拉1是不是太困難:

(defn euler1 
    [n] 
    (reduce + 
    (filter #(or (= (rem % 5) 0) (= (rem % 3) 0)) (range n)))) 

測試,如果我們得到正確的結果:

user=> (euler1 10) 
23