Haskell 生成子集

标签 haskell subset-sum

我有一个函数“子集”,它生成给定集合的所有子集:

subsets :: [Int] -> [[Int]]
subsets []  = [[]]
subsets (x:xs) = subsets xs ++ map (x:) (subsets xs)

如何在另一个函数中组合 map、foldl 和 filter 以返回所有元素总和为 0 的子集?

**例子: **
set    = [1,-1,5,2,-2,3]
result = [[1,-1],[2,-2],[-1,-2,3]]

最佳答案

你已经有子集了。所以我们需要一个函数

filterSubs :: [[Int]] -> [[Int]]
filterSubs = --remove all subsets which don't sum to 0

所以接下来我们需要一个谓词
sumZero :: [Int] -> Bool
sumZero xs = sum xs == 0

现在,使用这个和filter易于构建filterSubs .我会把这个留给你来弄清楚它是如何工作的。然后我们的解决方案是微不足道的
zeroSubs = filterSubs . subsets

关于Haskell 生成子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19772427/

相关文章:

haskell - `([] ==) []`的类型如何推断haskell?

windows - 适用于 Windows 的 Haskell IDE?

javascript - 在不使用递归的情况下改进连续范围的子集和算法

algorithm - 找到总和为 x 的所有子集 - 使用初始代码

arrays - 两个数组的最大子集和

haskell - 如何将 JPEG 图像旋转 45° 并将其保存回 Haskell 中的磁盘?

html - Pandoc 忽略 Markdown-Headlines

haskell - 如何在 Haskell 中使用 setElem 更新矩阵

algorithm - 大于或等于目标的数的倍数之和,优化

python - 如何找到 N 个数字,其总和最接近 K 但在多个列上?