Clojure 如何将第一个列表项移动到末尾?
对于给定列表:Clojure 如何将第一个列表项移动到末尾?,clojure,Clojure,对于给定列表: (1 2 3 4) 我希望获得以下输出: (2 3 4 1) 我产生的代码如下所示: (flatten (cons (rest l) (list (first l)))) 然而,我的感觉是,我把这件事复杂化了。还有其他想法吗?你不需要将acons展平,只需使用concat。 这是: 您还可以使用解构(在函数参数上或在let绑定中) 根据@stonemetal的提示,我们可以快速而缓慢地旋转一个向量,因此: (defn rotate [v n] (let [cv (cou
(1 2 3 4)
我希望获得以下输出:
(2 3 4 1)
我产生的代码如下所示:
(flatten (cons (rest l) (list (first l))))
然而,我的感觉是,我把这件事复杂化了。还有其他想法吗?你不需要将a
cons展平,只需使用concat
。
这是:
您还可以使用解构(在函数参数上或在let绑定中)
根据@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)
使用向量代替。然后康杰做了正确的事情。关于扁平化的良好本能。扁平化通常是错误的,因为它破坏了输入的结构
(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)