对于给定的清单:
(1 2 3 4)
我想得到输出:
(2 3 4 1)
我想出的代码看起来像这样:
(flatten (cons (rest l) (list (first l))))
然而我的感觉是,我过于复杂了。还有其他想法吗?
答案 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)