2014-12-03 37 views
3

在Clojure中,我有一个列表获得一个懒列表的前n项的懒列表

[a, b, c, d] 

,我想拉出来的元组的一个新的无限名单

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

我想弄清楚如何以纯粹的功能方式与内置的seq功能做到这一点。

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

更新:另外,为什么有人投票呢?

+1

我想downvote是因为你没有显示到目前为止你做了什么。 – m0skit0 2014-12-03 19:26:41

+1

'(取5(分区3 1(周期'(a b c d))))' – Kyle 2014-12-03 19:29:13

+0

谢谢@凯尔。我不知道分区的三个参数版本。 – interstar 2014-12-03 19:32:49

回答

10

这可以通过使用和partition

(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

cycle组合不使用分区来完成:

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