Clojure:最大列表

时间:2017-01-20 10:50:46

标签: clojure

尝试编写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,它打印两个数字,谁可以帮助我

2 个答案:

答案 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"是"将一堆值减少为单个值"

对于这些情况,一般来说,有几种方法:

  1. 在已经完成它的公共或核心库中找到现有函数。
  2. 使用reduce系列函数之一。
  3. 以下是每个例子:

    首先我们将使用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