2014-12-03 62 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))