2016-11-14 172 views
0

因此,在一個Java Dev職位的求職面試中,我被要求設計一個算法來從一百萬個數值中找出十個最大值。我想出了一個簡單的蠻力算法,這比我的面試官滿意得多。我明天去參加第二輪面試。Clojure打印列表兩次,當我只打一次打印

因爲我喜歡挑戰自己,我一直在閱讀「勇敢和真實的Clojure」,在面試後不久就訪問了Lazy Sequences和Collections部分,並開始想知道我是否不能實現Clojure函數來完成同樣的任務。

我得到了實際的過濾功能正常工作,但無法理解我在運行應用程序時看到的內容。這裏是我的代碼:

(defn random-numbers 
    ([] (random-numbers 0)) 
    ([n] (cons n (lazy-seq (random-numbers (rand 10000)))))) 

(def big-array (take 1000000 (random-numbers))) 

(defn top-ten [[big0 big1 big2 big3 big4 big5 big6 big7 big8 big9 :as acc] x] 
    (cond 
    (> x big0) [x big1 big2 big3 big4 big5 big6 big7 big8 big9] 
    (> x big1) [big0 x big2 big3 big4 big5 big6 big7 big8 big9] 
    (> x big2) [big0 big1 x big3 big4 big5 big6 big7 big8 big9] 
    (> x big3) [big0 big1 big2 x big4 big5 big6 big7 big8 big9] 
    (> x big4) [big0 big1 big2 big3 x big5 big6 big7 big8 big9] 
    (> x big5) [big0 big1 big2 big3 big4 x big6 big7 big8 big9] 
    (> x big6) [big0 big1 big2 big3 big4 big5 x big7 big8 big9] 
    (> x big7) [big0 big1 big2 big3 big4 big5 big6 x big8 big9] 
    (> x big8) [big0 big1 big2 big3 big4 big5 big6 big7 x big9] 
    (> x big9) [big0 big1 big2 big3 big4 big5 big6 big7 big8 x] 
    :else acc)) 

(defn top-ten-list [coll] 
    (reduce top-ten [0 0 0 0 0 0 0 0 0 0] coll)) 

(defn unlines [coll] 
    (clojure.string/join \newline coll)) 

(defn -main [] 
    (print (unlines (top-ten-list big-array)))) 

(-main) 

而且兩次產生預期的輸出:

9999.978584142405 
9999.966008266641 
9999.954608202788 
9999.925928099525 
9999.779899149064 
9999.755392364965 
9999.75279348399 
9999.640257438374 
9999.615213138313 
9999.447171545269999.978584142405 
9999.966008266641 
9999.954608202788 
9999.925928099525 
9999.779899149064 
9999.755392364965 
9999.75279348399 
9999.640257438374 
9999.615213138313 
9999.44717154526 

輸出略有變化取決於我是否使用打印或的println,在第二盤開始輸出一個新的行,如果我使用println。

我相當確信第一個輸出是我調用函數和處理結果的方式的工件,但我不確定我出錯的地方!

+1

你是怎麼執行這個腳本的?只是複製粘貼這個腳本,運行它,我只看到一個版本的輸出,而不是雙倍。實際上,我使用[lein exec](https://github.com/kumarshantanu/lein-exec)像這樣運行它:'cat yourscript.clj | lein exec' –

+0

我是通過點擊IntelliJ中的運行按鈕/命令來運行它....我會試試你的方法。 – cptully

+1

@AlexMiller在下面評論說,刪除(-main)行將解決IntelliJ中的問題,並且確實如此。 @ MatiasElgart建議使用'lien exec'也可以。 – cptully

回答

4

底部的-main在您加載名稱空間時執行。然後你調用-main,再次運行它。所以,只要擺脫最後的(-main),你應該完成。

+0

亞歷克斯米勒 - 感謝您的解釋!這工作。 – cptully