Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure 如何将第一个列表项移动到末尾?_Clojure - Fatal编程技术网

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)