2013-06-21 26 views
3

我发现自己需要将一系列元素转换为一个“对”序列,其中第一个元素是初始序列的元素,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))))) 

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

回答

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

+0

谢谢Michal,非常具有启发性。 –

相关问题