在Clojure中,我有一个列表
[a, b, c, d]
我希望从中获取一个新的无限元组列表
[ [a,b,c], [b,c,d], [c,d,a], [d,a,b], [a,b,c] ... ]
我试图通过内置的seq函数以纯函数的方式弄清楚如何做到这一点。
这是直截了当的,我还没有破解它吗?或者它实际上是某种难题? (在其他语言中,我编写自己的循环迭代器并跟踪很多状态。)
更新:此外,为什么有人投票这个?
答案 0 :(得分:10)
(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))