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

如何在clojure中对varargs进行排序?,clojure,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]))))))) 但是,

我想在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])))))))

但是,该代码不起作用。有什么问题吗?

这不是数组的
功能,也不是它的使用方式


(conj rest x y)
替换
(数组[x y rest])
。@noisesmith找到了代码不工作的本质。然而,这里还有另一个(次要)问题,那就是可以简化函数参数的结构

按照现在的方式,您正在将参数分解(分离)为
x
y
和rest
,但实际上,您可以通过将它们重新组合到一个要排序的集合中来“撤消”分解。为什么不将参数作为一个集合,然后对其进行排序,等等。?见下文:

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

在一个不相关的注释中,每当你有这样的函数调用链时,你可以考虑使用:


非常感谢,@noisesmith是的,conj可以工作。请你解释一下为什么我必须把rest放在conj前面,即(conj rest x y),而不是(conj x y rest)。(后者在本例中不起作用。)conj将集合作为其第一个参数,后跟要添加到该集合中的任意数量的元素。其余的是一个集合,x和y不是。非常感谢!你的回答和解释很中肯。哦,这真的很有启发性——varargs和->>宏。作为补充,如果我将参数设置为[&nums],它也可以接受少于两个参数。非常感谢。在《Clojure的乐趣》一书中,作者写道:“惯用的Clojure代码很少使用反向函数。”有没有办法改进这段代码?可以使用,它返回集合中的最后两个值<代码>(取2(反向(排序nums))
可以简化为
(取最后2(排序nums))
。哇,Clojure是如此强大和有趣。谢谢你,戴夫。
(defn sum-two-largest-square [& nums]
  (->> nums
       sort
       reverse
       (take 2)
       (map square)
       (apply +)))