Haskell中列表元素的子集

时间:2015-05-17 07:19:17

标签: haskell

任何人都可以帮助我生成给定集合的所有子集吗?

示例:如果我有[2,3,4]并且如果我想要K = 2,那意味着我需要两对=> [[2,3],[3,2],[2,4],[4,2],[3,4],[4,3]]

我编写了这段代码,但它只生成了多个子集:

arrange::Int->Int->Int
arrange n 1=n
arrange n r=n*arrange (n-1) (r-1)

另一个版本,但这并没有生成子集的所有解决方案:

  arrange 0 _ =[[]]
  arrange _ []=[]
  arrange n (x:xs)=(map(x:)) (arrange (n-1) xs)++
                   (arrange n xs)

1 个答案:

答案 0 :(得分:3)

根据您的示例,这是一个可能的解决方案:

import Data.List (permutations)

pick :: Int -> [a] -> [[a]]
pick 0 _ = [[]]
pick _ [] = []
pick n (x:xs) = map (x:) (pick (n-1) xs) ++ pick n xs

arrange :: Int -> [a] -> [[a]]
arrange n = concatMap permutations . pick n

例如

λ> arrange 2 [2,3,4]
[[2,3],[3,2],[2,4],[4,2],[3,4],[4,3]]

你可以看到诀窍就是选择一些元素,然后得到结果的所有排列(使用concatMap将它们连接在一起)

当然这可能是作业,所以你可能想要自己实施permutations;)