我发现自己需要将一系列元素转换为一系列“对”,其中第一个元素是初始序列的元素,而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)))))
是否有内置功能,或内置功能的简单组合,可以更容易地做到这一点?
答案 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 vector
到map list
等。
另外,关于问题文本中的head-and-tail
impl:双向分支cond
最好写成if
。