当前位置:  开发笔记 > 编程语言 > 正文

是否有可能将一个clojure矢量解构为最后两个项目,其余的?

如何解决《是否有可能将一个clojure矢量解构为最后两个项目,其余的?》经验,为你挑选了2个好方法。

我知道我可以像这样"从前面"构建一个矢量:

(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))) 

它试图找出是否有办法直接在函数参数中以更方便的方式做到这一点.



1> WolfeFan..:
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

我的建议是抛出的方便了风和使用peek,并pop与载体的把工作进行到底.当您的输入向量非常大时,您将看到巨大的性能提升.

(另外,回答标题中的问题:不.)



2> Thumbnail..:

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

((fn [v] (let [[b a] (rseq v)] (+ a b))) [1 2 3 4])
; 7

rseq 在快速时间内为矢量提供反向序列.

我们只是解构它的前两个元素.

我们不需要提及其余部分,我们不做任何事情.


我之前没有使用过`rseq`,它非常适合这个问题.我计时了,而且我的答案非常接近表现.
推荐阅读
雯颜哥_135
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有