如何从clojure中的列表中获取最大数字

时间:2013-09-16 14:59:44

标签: 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 proj_one.core$_main$top_one_list__30@13c0b53>

有什么想法吗?

2 个答案:

答案 0 :(得分:12)

函数max返回它传递的参数的最大值:

(max 1 2 3 4 5)

要使用序列调用它,您可以使用apply:

(apply max boxes)

Dao Wen指出,如果序列可能为空,则reduce允许指定默认值:

(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)

答案 1 :(得分:0)

另一个答案已经为您提供了找到最大数字的正确解决方案。我想补充一下为什么你的解决方案(无论如何返回其他东西,不仅仅是最大的数字,还包括之前被认为是最大的所有数字的列表)都无效。

问题是,在println来电的参数列表中,您没有呼叫top-one-list,您只是指功能本身。您需要将其更改为(top-one-list boxes)以调用该函数。