获取惰性列表的前n项的惰性列表

时间:2014-12-03 19:08:09

标签: clojure sequences

在Clojure中,我有一个列表

[a, b, c, d]

我希望从中获取一个新的无限元组列表

[ [a,b,c], [b,c,d], [c,d,a], [d,a,b], [a,b,c] ... ]

我试图通过内置的seq函数以纯函数的方式弄清楚如何做到这一点。

这是直截了当的,我还没有破解它吗?或者它实际上是某种难题? (在其他语言中,我编写自己的循环迭代器并跟踪很多状态。)

更新:此外,为什么有人投票这个?

2 个答案:

答案 0 :(得分:10)

这可以使用cyclepartition

的组合来完成
(take 5 (partition 3 1 (cycle '(a b c d))))
;; => ((a b c) (b c d) (c d a) (d a b) (a b c))

答案 1 :(得分:1)

不使用分区:

(defn next-rotation [coll]
  (take (count coll) (drop 1 (cycle coll))))

(defn tuples [n coll]
  (lazy-seq (cons (take n coll) (tuples n (next-rotation coll)))))

;; (take 5 (tuples 3 '(a b c d))) ;; =>
;; ((a b c) (b c d) (c d a) (d a b) (a b c))