我正在尝试用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])))))))
但是,代码不起作用。怎么了?
答案 0 :(得分:2)
这不是to-array
的用途,也不是它的用法。
将(to-array [x y rest])
替换为(conj rest x y)
答案 1 :(得分:1)
@noisesmith了解了为什么你的代码不起作用的本质。但是,这里还有另一个(次要)问题,即函数参数的结构可以简化。
你现在拥有它的方式,你正在将参数解构(分离)为x
,y
& 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 +)))