【问题标题】:Haskell 99 Questions #27Haskell 99 题 #27
【发布时间】:2019-05-26 17:41:17
【问题描述】:

我在概念化 haskell 的 99 个问题 https://wiki.haskell.org/99_questions/Solutions/27 中问题 27 的给定答案时遇到了困难。

问题: " 将集合的元素分组为不相交的子集。

a) 一个 9 人的小组在 2、3 和 4 人的 3 个不相交的小组中可以有多少种工作方式?编写一个函数,生成所有可能性并在列表中返回它们。

例子:

* (group3 '(aldo beat carla david evi flip gary hugo ida))
( ( (ALDO BEAT) (CARLA DAVID EVI) (FLIP GARY HUGO IDA) )
... )

b) 以我们可以指定组大小列表的方式概括上述谓词,并且谓词将返回组列表。 "

他们给出的答案是这样的:

combination :: Int -> [a] -> [([a],[a])]
combination 0 xs     = [([],xs)]
combination n []     = []
combination n (x:xs) = ts ++ ds
  where
    ts = [ (x:ys,zs) | (ys,zs) <- combination (n-1) xs ]
    ds = [ (ys,x:zs) | (ys,zs) <- combination  n    xs ]


group :: [Int] -> [a] -> [[[a]]]
group [] _ = [[]]
group (n:ns) xs =
    [ g:gs | (g,rs) <- combination n xs
           ,  gs    <- group ns rs ]

我在理解第一部分(定义函数“组合”的部分)如何运作时遇到了很多麻烦。 我对 haskell 也很陌生,所以请像我五年级一样向我解释它。

感谢任何反馈。

【问题讨论】:

    标签: haskell recursion functional-programming


    【解决方案1】:
    combination 0 xs     = [([],xs)]
    

    如果我们想从xs中选择0个元素,只有一种方法。 [] 没有元素被占用,所有元素 xs 都保留在那里。

    combination n []     = []
    

    否则,我们要选择n (>0) 个元素。如果我们想从空列表[] 中选择它们,没有办法做到这一点——这是不可能的。

    combination n (x:xs) = ts ++ ds
      where
        ts = [ (x:ys,zs) | (ys,zs) <- combination (n-1) xs ]
        ds = [ (ys,x:zs) | (ys,zs) <- combination  n    xs ]
    

    否则,我们想从非空列表x:xs 中选择n (>0) 个元素。有很多方法可以做到这一点,我们将它们分为以下两组:

    • 我们决定采用元素x,剩下的就是从xs中选择n-1。这是在ts 中完成的,它考虑了从xs 中选择n-1 元素的所有方式,然后将x 添加到“选择”元素列表ys

    • 我们决定从输入列表中删除元素x,然后从xs 中选择n。这是在ds 中完成的,它考虑了从xs 中选择n 元素的所有方式,然后将x 添加到“已删除”元素列表zs

    然后我们使用ts++ds 输出所有此类组合。

    【讨论】:

      【解决方案2】:

      功能组合采用列表和一个数字。考虑到列表必须仅分为两部分,它创建了列表的组合。这只是用 2 个数字 k 和 n-k 简化的原始问题。

      它使用 ts 和 ds 列表来做到这一点。

      ts 是当第一个元素位于第一部分时,然后递归与剩余列表和 k-1 一起发生。 ds 是第一个元素在第二部分中的位置,并且递归发生在 k 和剩余部分中。计算完剩余部分后,将第一个元素添加到其中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-09-14
        • 1970-01-01
        • 1970-01-01
        • 2018-01-26
        • 2015-06-26
        • 2021-07-09
        • 2018-04-27
        • 1970-01-01
        相关资源
        最近更新 更多