从Clojure中的向量中找到"中间元素"

mon*_*962 4 clojure

Clojure中简单的新手问题......

如果我在Clojure向量中有奇数个元素,我该如何提取"中间"值?我已经看了一段时间,但无法解决这个问题!

一些例子:

  • (middle-value [0]) 应该回来 [0]
  • (middle-value [0 1 2]) 应该回来 [1]
  • (middle-value [0 1 :abc 3 4]) 应该回来 [:abc]
  • (middle-value [0 1 2 "test" 4 5 6]) 应该回来 ["test"]

ber*_*eal 7

如何计算中间索引并通过它进行访问?

(defn middle-value [vect]
  (when-not (empty? vect)
    (vect (quot (count vect) 2))))
Run Code Online (Sandbox Code Playgroud)


Mic*_*ent 5

一个有点低效但有趣的实现(使用序列抽象而不是具体的向量):

(defn middle [[fst & rst]]
  (if-not rst fst
    (recur (butlast rst))))
Run Code Online (Sandbox Code Playgroud)

nil在偶数元素的情况下返回.

不那么有趣但效率更高:

(nth v (quot (count v) 2))
Run Code Online (Sandbox Code Playgroud)

v矢量在哪里.