2014-12-03 2 views
3

, 나는 목록Clojure의에서

[a, b, c, d] 

을하고 난 그것의 튜플의 새로운 무한 목록을 끌어 할

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

나는 내장 된 seq 함수를 사용하여 순전히 기능적인 방법으로이를 수행하는 방법을 알아 내려고하고있다.

이것은 간단하며 아직 금식하지 않았습니까? 아니면 실제로 어떤 종류의 어려운 문제입니까? (다른 언어에서는 필자 자신의 원형 반복자를 작성하고 많은 상태를 추적 할 것입니다.)

업데이트 : 또한 왜 누군가가 이것을 투표합니까?

+1

난 당신이 표시되지 않았기 때문에 downvote가 지금까지 무슨 짓을했는지 생각 . – m0skit0

+1

'(테이크 5 (파티션 3 1 (사이클 '(a b c d))))' – Kyle

+0

@Kyle. 파티션의 세 가지 인수 버전에 대해 알지 못했습니다. – interstar

답변

10

이 파티션을 사용하지 않고 cycle의 조합 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

를 사용하여 수행 할 수 있습니다

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