尝试编写Clojure程序: 定义函数maxim以查找列表中的最大元素
(def boxes [33 11 44 22 66 55])
(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 "Biggest volume from boxes:" top-one-list)
但输出结果是:66 44,它打印两个数字,谁可以帮助我
答案 0 :(得分:3)
这一行:
(> x big1) [x big1]
返回两个元素。你只想要一个。
应该是:
(> x big1) [x]
更简洁的方式是编写它不是使用列表,而是只使用一个数字作为缩减过程的状态:
(defn top-one [big1 x]
(if (> x big1)
x
big1))
(defn top-one-list [boxes]
(reduce top-one 0 boxes))
答案 1 :(得分:1)
clojure中有一些常见的数据操作类。有些人会称他们为模式,尽管几年前这个词被用于其他目的。
这个" patern"是"将一堆值减少为单个值"
对于这些情况,一般来说,有几种方法:
reduce
系列函数之一。以下是每个例子:
首先我们将使用reduce来解决它:
user> (def boxes [33 11 44 22 66 55])
#'user/boxes
user> (reduce max boxes)
66
Reduce维持两个值,就像它的工作一样,首先是答案 - 因此远,第二个是仍然需要包含在答案中的数据。它还跟踪一个功能,即接收var和一条新信息的答案,并产生包含该信息的新答案。当答案包含所有可用信息时,该过程停止。在这种情况下,我选择了max
函数作为决策函数。
然后只需使用内置函数:
user> (apply max boxes)
66
max
可能不是一个明显的选择,因为它需要一堆离散的参数,而你想要在列表上工作。这是一种常见情况,apply
通过使用集合作为参数构建函数调用来很好地解决它。
(apply max [1 2 3])
成为有效的函数调用:
(max 1 2 3)
和max很高兴能够有效地利用大量的论点:
user> (apply max (range 1e7))
9999999