4

我是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})

这样的事情存在吗?如果没有,是否有一种很好、干净、惯用的方法来编写函数?

4

1 回答 1

10

看看组合学。它可以满足您的需要:

; 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

于 2013-02-28T22:28:44.390 回答