如何在clojure中对varargs进行排序?
我想在clojure中做一个练习:给定一些数字,选择两个最大的数字,并求它们的平方和 这是我的密码:如何在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]))))))) 但是,
(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 +)))