5

我是 Haskell 的完整初学者,我有 11 个作业练习,其中 10 个我已经解决了。我找到了几种获得集合的幂集的解决方案,但没有一个包括列表理解。我知道在这种情况下我不应该要求一个完整的答案(因为这是家庭作业),但我非常感谢任何反馈/线索。

集合S的幂集是包含S的所有子集的集合。编写一个递归函数powerset,返回一个包含给定集合的所有子集的集合。使用直接递归和列表推导。

4

3 回答 3

7

使用直接递归和列表推导:

type Set a = [a]

powerset :: Set a -> Set (Set a)
powerset [] = [[]]
powerset (x:xs) = [x:ps | ps <- powerset xs] ++ powerset xs
于 2016-09-16T20:16:04.113 回答
5

好的,这是我的提示:

如果您查看类似(x:xs)的内容,您现在可以选择是否包含 x在您的子集中。

不知何故必须使用这两种选择(可能与(++);))...

现在请记住其他提示(递归xs....),如果您考虑一下,也许您会有所了解[x:ys | ys <- ...]


顺便说一句:这几乎是作弊,但如果你找到了一个使用do符号的解决方案:这真的很容易转化为列表推导;) - 也许你可以发布你的进展?

于 2015-09-15T08:06:44.057 回答
1

文本说“使用直接递归”。因此,当您需要计算时,subsets (x:xs)您可以从考虑subsets xs递归调用开始。有没有办法将 的 子集变成 的子集xsx:xs也许使用列表推导?

于 2015-09-15T07:33:47.030 回答