如何在clojure中对varargs进行排序?

时间:2014-10-28 01:54:35

标签: clojure

我正在尝试用clojure进行练习:给出一些数字,选择两个最大的数字并加总它们的平方。

这是我的代码:

(defn square [x]
    (* x x))

(defn sum-two-largest-square [x y & rest]
  (apply + 
    (map square 
      (take 2 
        (reverse 
          (sort
            (to-array [x y rest])))))))

但是,代码不起作用。怎么了?

2 个答案:

答案 0 :(得分:2)

这不是to-array的用途,也不是它的用法。

(to-array [x y rest])替换为(conj rest x y)

答案 1 :(得分:1)

@noisesmith了解了为什么你的代码不起作用的本质。但是,这里还有另一个(次要)问题,即函数参数的结构可以简化。

你现在拥有它的方式,你正在将参数解构(分离)为xy & rest,然而你基本上是"撤消"通过将它们组合成一个单独的集合进行排序来进行解构。为什么不将参数保留为单个集合,然后对其进行排序等?见下文:

(defn sum-two-largest-square [& nums]
  (apply +
    (map square
      (take 2
        (reverse
          (sort nums))))))

在一个不相关的说明中,每当你有这样的函数调用链时,你可以考虑使用threading macro

(defn sum-two-largest-square [& nums]
  (->> nums
       sort
       reverse
       (take 2)
       (map square)
       (apply +)))