【问题标题】:Generating all contiguous sublists of a list生成列表的所有连续子列表
【发布时间】:2013-03-14 01:44:49
【问题描述】:

我对 Haskell 有点陌生,我正在尝试生成列表的所有连续子列表。

我目前有以下:

listSublists :: [a] -> [[a]]
listSublists []     = [[]]
listSublists xs     = [xs] ++ listSublists (init xs) 

我知道上面的函数会生成删除最后一个元素的子列表,但我不知道如何完成我的伪代码。

我的伪代码基本上是,

取整个完整列表,去掉尾部。将 (x:xs) 的 xs 传入 列表子列表

例如,xs = [1,2,3] [xs] ++ listSublists (init xs) 将生成 [1,2,3,4], [1,2,3], [1,2], [1], [] 我正在尝试继续将 [2,3,4] 作为 xs 传入,直到列表用完。

谁能给我一些建议?还是我的想法完全错误?

【问题讨论】:

    标签: list haskell sublist


    【解决方案1】:

    您拥有的listSublists 函数在功能上几乎与 inits 功能。您走在正确的轨道上,因为您目前可以列出所有 给定列表的前缀。

    您想问的是“什么是列表的子列表?”一个答案是它 是列表前缀的后缀(即从 列表的末尾,然后从该列表的前面删除一些元素,并且 你有一个连续的子列表)。

    所以,如果你有你的prefixes,那么你想要的是一种生成所有 给定前缀的后缀(即某些列表)。所以,如果你有

    prefixes :: [a] -> [[a]]
    prefixes []     = [[]]
    prefixes xs     = [xs] ++ prefixes (init xs) 
    

    你还想要一个对应的函数suffixes

    suffixes :: [a] -> [[a]]
    suffixes []     = [[]]
    suffixes xs     = [xs] ++ suffixes (??? xs) 
    

    我会留给你弄清楚??? 的用途。有了这两个 函数,然后您只需获取所有前缀,并生成所有后缀 获取所有连续的子列表

    allSublists :: [a] -> [[a]]
    allSublists = concat . map suffixes . prefixes
    

    您可能希望删除结果集中的所有空列表, 因为它们并不是一个有趣的案例。

    【讨论】:

    • 感谢您的回答。我知道我想用尾巴来???但我并没有真正得到concat . map suffixes . prefixes 部分。我不完全确定如何正确编写它。
    • @user1043625 我不确定你的意思。你就是这样写的。除非您想知道如何在其中编写列表函数。否则,它只是函数的组合。
    • 我相信我误解了您答案的某些部分,但我相信我已经弄清楚了。我实际上正在以不同的方式进行操作。 listSuffix(xs) ++ listPrefix(init xs)。现在我需要找到一种方法来删除空列表的重复项。
    【解决方案2】:

    所有子列表(不一定是连续的):

    sublists [] = [[]]
    sublists (x:xs) = [x:sublist | sublist <- sublists xs] ++ sublists xs
    

    只有连续的子列表:

    nub $ concat $ map tails $ inits ls
    

    或

    (:) [] $ filter (\x -> length x /= 0) $ concat $ map tails $ inits ls
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-01
      • 2015-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多