【问题标题】:Generating Sublists of a list生成列表的子列表
【发布时间】:2012-03-22 23:14:52
【问题描述】:

我是 haskell 的新手,正在尝试编写一个函数来生成一个仅包含连续子集的 powerset 例如:[1,2,3] -> [[],[1],[2],[3],[1,2],[2,3],[1,2,3]]

我在博客 http://davidtran.doublegifts.com/blog/?p=7 上找到了这个

powerset :: [a] -> [[a]]
powerset []     = [[]]
powerset (x:xs) = powerset xs ++ map (x:) (powerset xs)
-- powerset (x:xs) = powerset xs ++ [x:xs' | xs' <- powerset xs]

但这会生成我不想要的所有子集,即包含的 [1,3]? 无论如何要修复此代码以使其正常工作,还是我必须重新考虑我的方法。 我也不想使用内置的库函数,想把我的基础知识搞好。

【问题讨论】:

  • “连续子集”是什么意思?
  • 我的意思是 [1,2] [2,3] 但不是 [1,3]
  • 作为术语:我通常看到人们使用术语 substring 来指代“连续的子集”,而术语 subsequence 用于不一定是连续的子集。
  • @missingno:这很有意义!我不知何故有一个(愚蠢的)想法,即子集 themself 必须是连续的(或者你可以通过“加 1”从 [1,2] 到 [2,3]),而不是元素它们包含。

标签: haskell functional-programming


【解决方案1】:

类似

conseqPower = ([] :) . concatMap (tail . inits) . tails

【讨论】:

  • 我会试试这个,但我宁愿不要使用 2 个函数
  • 好吧,你可以自己写。但是只重用现有函数会更方便。
【解决方案2】:

过滤掉非“连续”列表。

【讨论】:

  • 我能得到一些不确定如何过滤的代码,或者一些过滤功能的链接吗?
  • 这种方法似乎需要Eq a,并且在列表中存在重复项的情况下似乎仍然很困难(例如考虑powerset "hello")。
  • @dave4420 鉴于该示例是一个不同整数的序列,我不确定这对 OP 的情况是否重要。
  • 虽然从算法上讲,这是一个非常糟糕的主意......因为他的函数产生的输出(n中的2,所以n^2)比powerset(2^n)少得多,所以去产生所有 powerset 只是为了过滤掉绝大多数的痛苦。
  • @Jedai 当然,但这是一个解决方案,并且可以轻松实施。毫无疑问,您会同意这总比没有解决方案要好。
猜你喜欢
  • 2019-01-22
  • 2019-02-18
  • 1970-01-01
  • 2018-06-15
  • 2023-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多