如何将第一个列表项移到最后?

时间:2014-04-22 17:16:01

标签: clojure

对于给定的清单:

(1 2 3 4)

我想得到输出:

(2 3 4 1)

我想出的代码看起来像这样:

(flatten (cons (rest l) (list (first l))))

然而我的感觉是,我过于复杂了。还有其他想法吗?

3 个答案:

答案 0 :(得分:2)

您不需要flatten cons,只需使用concat。 这是an example

(let [fruit ["apple" "orange" "grapes" "bananas"]]
  (concat (rest fruit) [(first fruit)])

答案 1 :(得分:2)

开发@ stonemetal的提示,我们可以快速而懒洋洋地旋转矢量:

(defn rotate [v n]
  (let [cv (count v), n (mod n cv)]
    (concat (subvec v n cv) (subvec v 0 n))))

它适用于任何一个方向:

(map #(rotate (vec (range 5)) %) (range -2 8))
;((3 4 0 1 2)
; (4 0 1 2 3)
; (0 1 2 3 4)
; (1 2 3 4 0)
; (2 3 4 0 1)
; (3 4 0 1 2)
; ...
; (2 3 4 0 1))

所以将序列中的第一个旋转到结尾:

(rotate (vec (range 1 5)) 1)

答案 2 :(得分:0)

您也可以使用解构(在函数参数或let绑定中)。

(let [[h & tail] '(1 2 3 4)]
  (concat tail (list h)))  ;=> (1 2 3 4)