【发布时间】:2017-04-05 11:15:12
【问题描述】:
我正在尝试从一组N 中获取 3 个元素的所有有序组合:
元素,即:["A","B","C","D"] --> ["ABC","ABD","ACD","BCD"].
我想过写[ x++y++z | pos(x)in list < pos(y) in list < pos(z) in list ]之类的东西
我该怎么做?
【问题讨论】:
标签: list haskell combinations
我正在尝试从一组N 中获取 3 个元素的所有有序组合:
元素,即:["A","B","C","D"] --> ["ABC","ABD","ACD","BCD"].
我想过写[ x++y++z | pos(x)in list < pos(y) in list < pos(z) in list ]之类的东西
我该怎么做?
【问题讨论】:
标签: list haskell combinations
您可以为三个元素编写函数,例如使用tails :: [a] -> [[a]]:
[x++y++z | (x:xs) <- tails list, (y:ys) <- tails xs, (z:_) <- tails ys]
这会生成:
Prelude> :m Data.List
Prelude Data.List> (\list -> [x++y++z | (x:xs) <- tails list, (y:ys) <- tails xs, (z:_) <- tails ys]) ["A","B","C","D"]
["ABC","ABD","ACD","BCD"]
但通常您需要一个更可扩展的解决方案(您可以生成 k 元素组合的解决方案)。例如,您可以定义一个函数combinations :: Int -> [a] -> [[a]],例如:
combinations 0 _ = [[]]
combinations n ls = [ (x:ys) | (x:xs) <- tails ls, ys <- combinations (n-1) xs ]
然后你必须concat所有元素(例如使用map)。
【讨论】:
你去吧:
combinations 0 lst = [[]]
combinations k lst = do
(x:xs) <- tails lst
rest <- combinations (n-1) xs
return $ x : rest
现在,要获得您想要的结果,请使用map concat (combinations 3 ["A","B","C","D"])。
【讨论】: