是否有更简单的方法来获取序列的每个元素,与"它的"尾部配对?

Mik*_*gan 3 clojure

我发现自己需要将一系列元素转换为一系列"对",其中第一个元素是初始序列的元素,而while的第二个元素是该元素的初始序列的尾部.

(abcde) - >((a(bcde))(b(cde))(c(de))(d(e))(e()))

我写了这个:

(defn head-and-tail [s]
  (cond (empty? s) ()
    :else (cons (list (first s) (rest s)) (head-and-tail (rest s)))))
Run Code Online (Sandbox Code Playgroud)

是否有内置功能,或内置功能的简单组合,可以更容易地做到这一点?

Mic*_*zyk 6

这是一种方法:

(let [xs [1 2 3 4]]
  (map list xs (iterate rest (rest xs))))
;= ((1 (2 3 4)) (2 (3 4)) (3 (4)) (4 ()))
Run Code Online (Sandbox Code Playgroud)

这当然可以调整,以满足您的需求,比如你可能更喜欢map vectormap list

另外,关于head-and-tail问题文本中的impl:双向分支cond将更好地编写为if.