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)))))

是否有内置函数或内置函数的简单组合可以更轻松地做到这一点?

4

1 回答 1

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.

于 2013-06-21T11:12:36.023 回答