【问题标题】:Combinations of k elements from set N haskell来自集合 N haskell 的 k 个元素的组合
【发布时间】: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


    【解决方案1】:

    您可以为三个元素编写函数,例如使用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 -&gt; [a] -&gt; [[a]],例如:

    combinations 0 _ = [[]]
    combinations n ls = [ (x:ys) | (x:xs) <- tails ls, ys <- combinations (n-1) xs ]
    

    然后你必须concat所有元素(例如使用map)。

    【讨论】:

      【解决方案2】:

      你去吧:

      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"])

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-28
        • 1970-01-01
        • 1970-01-01
        • 2023-01-12
        相关资源
        最近更新 更多