2013-02-28 3 views
4

Я новичок в Clojure, ищу функцию, чтобы генерировать перестановки подмножеств:clojure: перестановки подмножеств?

=> (find-subsets 1 #{1 2 3 4}) 
(#{1} #{2} #{3} #{4}) 

=> (find-subsets 2 #{1 2 3 4}) 
(#{1 2} #{1 3} #{1 4} #{2 3} #{2 4} #{3 4}) 

=> (find-subsets 3 #{1 2 3 4}) 
(#{1 2 3} #{1 3 4} #{2 3 4}) 

Существует ли такая вещь? Если нет, есть ли хороший, чистый, идиоматический способ кодирования функции?

+0

Возможный дубликат [Объединить последовательность с собой рекурсивно, без дубликатов] (http://stackoverflow.com/questions/15123069/combine-sequence-with-itself-recursive-without-duplicates) – amalloy

ответ

10

Посмотрите на combinatorics. Он делает то, что вам нужно:

; all the unique ways of taking n different elements from items 
(clojure.math.combinatorics/combinations [1 2 3] 2) 
;;=> ((1 2) (1 3) (2 3)) 

Если он жалуется, потому что вы используете набор вместо вектора, просто преобразовать в вектор с VEC перед вызовом combinations.

Смежные вопросы