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

时间:2013-06-21 10:54:56

标签: clojure

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

  

(a b c d e) - > ((a(b c d e))(b(c d e))(c(d e))(d(e))(e()))

我写了这个:

(defn head-and-tail [s]
  (cond (empty? s) ()
    :else (cons (list (first s) (rest s)) (head-and-tail (rest s)))))

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

1 个答案:

答案 0 :(得分:6)

这是一种方法:

(let [xs [1 2 3 4]]
  (map list xs (iterate rest (rest xs))))
;= ((1 (2 3 4)) (2 (3 4)) (3 (4)) (4 ()))

这当然可以根据您的需要进行调整,例如您可能更喜欢map vectormap list等。

另外,关于问题文本中的head-and-tail impl:双向分支cond最好写成if