除了这个函数之外,还有更简单的方法可以在clojure中找到数组的最后一个元素吗?
(fn [l] (if (empty? (rest l)) (first l) (recur (rest l))))
答案 0 :(得分:10)
对于向量,请使用peek获取恒定时间
user=> (peek [1 2 3 4 5])
5
对于Java数组,
user=> (let [a (to-array [1 2 3 4 5])] (aget a (dec (alength a))))
5
对于常规集合,您可以使用last
获取线性时间内的最后一项。它的定义与您所做的类似。
user=> (source last)
(def
^{:arglists '([coll])
:doc "Return the last item in coll, in linear time"
:added "1.0"
:static true}
last (fn ^:static last [s]
(if (next s)
(recur (next s))
(first s))))
答案 1 :(得分:1)
最简单的方法是使用在线性时间内工作的(last l)
(http://clojure.github.io/clojure/clojure.core-api.html#clojure.core/last)
另一种可能性是撤消你的收藏并采取第一个元素:((comp first reverse) l)
。但是反向返回非惰性序列时速度相当慢。注意:comp
返回其参数(函数)(http://clojure.github.io/clojure/clojure.core-api.html#clojure.core/comp)
您还可以先将集合转换为矢量,然后应用peek:((comp peek vec) l)
。这应该有更好的表现。
另一个:确定集合的长度并采用最后一个元素(#(nth % (dec (count %))) l)
。
这些函数适用于所有集合类型(例如矢量,列表等)。在Clojure中本身没有数组(除了你想使用Java数组)。