可以将clojure向量分解为最后两项和其余项



我知道我可以像这样"从前面"销毁向量:

(fn [[a b & rest]] (+ a b))

是否有任何(短)方法可以访问最后两个元素

(fn [[rest & a b]] (+ a b)) ;;Not legal

我目前的选择是

(fn [my-vector] (let [[a b] (take-last 2 my-vector)] (+ a b))) 

它试图弄清楚是否有办法直接在函数参数中以更方便的方式做到这一点。

您可以剥离最后两个元素,然后添加它们:

((fn [v] (let [[b a] (rseq v)] (+ a b))) [1 2 3 4])
; 7
  • CCD_ 1在短时间内为矢量提供反向序列
  • 我们只是破坏了它的前两个元素
  • 我们不必提及它的其余部分,对此我们什么都不做
user=> (def v (vec (range 0 10000000)))
#'user/v
user=> (time ((fn [my-vector] (let [[a b] (take-last 2 my-vector)] (+ a b))) v))
"Elapsed time: 482.965121 msecs"
19999997
user=> (time ((fn [my-vector] (let [a (peek my-vector) b (peek (pop my-vector))] (+ a b))) v))
"Elapsed time: 0.175539 msecs"
19999997

我的建议是把方便抛到九霄云外,使用peekpop来处理向量的末尾。当您的输入向量非常大时,您将看到巨大的性能提升。

(此外,要回答标题中的问题:

最新更新