2015-12-08 9 views
6

ben böyle "önden" bir vektör destructure biliyorum:Bir clojure vektörünü son iki maddeye ve geri kalanına yıkmak mümkün mü?

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

son iki öğe erişmek yerine herhangi (kısa) bir yolu var mı?

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

Benim şu anki alternatif

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

etmektir ve fonksiyon argümanları doğrudan daha uygun bir şekilde bunu yapmanın yolu olup olmadığını anlamaya çalışıyordum.

cevap

9

ve böylece onları ekleyin:

(hayır. Ayrıca, başlıktaki soruyu cevaplamak için):

((fn [v] (let [[b a] (rseq v)] (+ a b))) [1 2 3 4]) 
; 7 
  • rseq bir ters besler hızlı bir zamanda bir vektör için dizisi.
  • İlk iki öğeyi yok ediyoruz.
  • Geri kalanından bahsetmemeliyiz, ki hiçbir şey yapmıyoruz.
+1

Daha önce rseq kullanmamıştım ve bu soru için mükemmel bir şekilde uyuyor. Zamanlama yaptım ve cevabımın performansına çok yakın. – WolfeFan

11
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 

Benim tavsiyem rüzgara kolaylık atmak ve bir vektör sonuna çalışmak için peek ve pop kullanmak olacaktır. Giriş vektörünüz çok büyük olduğunda, olağanüstü performans artışı görürsünüz. Eğer son iki öğe soyulabilir olabilir

+0

Niiiccceee performans çözümü !!! –

İlgili konular