2013-09-16 58 views
4

我非常非常verrrrrryyy新(如昨天開始)Clojure。如何從clojure的列表中獲得最大數量

我有一個數字列表,需要找到列表中最大的一個。

我想出了這樣的事情至今:

def boxes [1 2 3 4 5]) 

(println "List of box volumes:" boxes) 

(defn top-one [[big1 :as acc] x] 
(cond 
(> x big1) [x big1] 
:else acc)) 

(defn top-one-list [boxes] 
(reduce top-one [0] boxes)) 

(println "Biggest volume from boxes:" top-one-list) 

這最後的println給了我一些奇怪的事情:

#<core$_main$top_one_list__30 [email protected]> 

任何想法?

+3

您是否在尋找最大功能? http://clojure.github.io/clojure/clojure.core-api.html#clojure.core/max – S4M

+0

此外,在最後一行中,您正在打印函數的*函數*而不是*結果*。你會想說'(println「來自箱子的最大音量:」(頂部一列))' –

回答

12

函數max返回最大的它傳遞的參數:

(max 1 2 3 4 5) 

要使用可以使用序列調用它適用於:

(apply max boxes) 

道文使得一個好點,如果序列可以爲空然後減少允許指定默認值:

(reduce max -1 []) # returns -1 

和山姆對於申請è作品:

(apply max -1 []) # returns -1 

否則申請將炸燬:

user=> (apply max []) 
ArityException Wrong number of args (0) passed to: core$max clojure.lang.AFn.th 
rowArity (AFn.java:437) 
+0

非常感謝! :) – lulu88

+1

另外,如果'boxes'可能是空的,你可以使用['reduce'](http://clojuredocs.org/clojure_core/clojure.core/reduce)提供一個默認值:'(reduce max 0 boxes )' – DaoWen

+0

@DaoWen:謝謝,把這個納入答案。 –

0

對方回答已經爲您提供了發現數量最多的解決方案。我只想補充說明爲什麼你的解決方案(無論如何還是返回別的東西,不僅僅是最大的數字,而且是以前被認爲是最大的所有數字的列表)不起作用。

問題是,在println調用的參數列表中,您沒有調用top-one-list,您只是指該函數本身。您需要將其更改爲(top-one-list boxes)以調用該函數。