作爲Clojure的新手,我經常難以表達最簡單的東西。例如,在一個向量替換最後一個元素,這將是如何替換Clojure中的最後一個元素
v[-1]=new_value
在python
,我結束了在Clojure的下列變量
(assoc v (dec (count v)) new_value)
這是相當長,無表情的說最少的還是
(conj (vec (butlast v)) new_value)
哪個更糟,因爲它有O(n)
運行時間。
這讓我感到無聊,就像一個試圖用俱樂部修理瑞士手錶的穴居人。
什麼是正確的Clojure方法來替換向量中的最後一個元素?
爲了支持我O(n)
-claim爲butlast
-version(Clojure的1.8):
(def v (vec (range 1e6)))
#'user/v
user=> (time (first (conj (vec (butlast v)) 55)))
"Elapsed time: 232.686159 msecs"
0
(def v (vec (range 1e7)))
#'user/v
user=> (time (first (conj (vec (butlast v)) 55)))
"Elapsed time: 2423.828127 msecs"
0
所以基本上10時元素的數量是慢10倍。
您的第一個辦法就是如何完成。顯然,你可以寫一個「替換 - 最後」的功能來清理它。我認爲Python過於簡潔的表達方式很不幸地破壞了你的期望。我不認爲後端索引經常需要在Clojure中對自己的語法提出警告。 +1,因爲我想證明是錯誤的。 – Carcigenicate
注意:如果'v'已經是一個向量(我推薦總是在Clojure列表上使用Clojure向量作爲默認選項,除非測量結果證明是否爲其他),否則解決方案#3不是O(n)。 –
這是一個定義明確的具體問題和答案,但我認爲值得指出的是,許多用Python中的索引表達式表達的算法都具有不需要使用索引的習慣Clojure等價物。 – glts