4

我对 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>

有任何想法吗?

4

2 回答 2

13

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

(max 1 2 3 4 5)

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

(apply max boxes)

Dao Wen 提出了一个很好的观点,如果序列可能是空的,那么 reduce 允许指定一个默认值:

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

同样适用于:

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

否则 apply 会炸毁:

user=> (apply max [])
ArityException Wrong number of args (0) passed to: core$max  clojure.lang.AFn.th
rowArity (AFn.java:437)
于 2013-09-16T15:05:35.297 回答
0

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

问题是在你调用的参数列表中println,你不是在调用top-one-list,你只是在引用函数本身。您需要将其更改为(top-one-list boxes)调用该函数。

于 2013-09-17T10:06:07.240 回答