Haskell列表清单

时间:2014-02-02 20:04:43

标签: list haskell recursion

说我在haskell [2,4,6,8,9,4]中有一个列表,我想从第一个元素开始然后跳过一两个元素并获得所有可能的组合。所以我应该获取列表列表。 所以对于上面的列表,我想返回以下列表[[2,6,9],[2,6,4],[2,8,4]]。 我到目前为止写了这个

paths :: [int] -> [int]
paths [] = []
paths [x]=[x]
paths (x:z:xs) = x:paths(xs)

但它只返回一个列表,从第一个元素开始,然后按一个跳转。所以我不知道如何让它递归,以便它跳过两个和一个所有可能的跳跃。

非常感谢帮助。

1 个答案:

答案 0 :(得分:2)

您想要跳过一个或两个元素。因此,您不仅需要一个,而且需要两个递归调用(如果您想通过递归策略解决此问题)。

但首先,让我们修复你的类型:

paths :: [a] -> [[a]]

另外,我要更改基本情况:如果输入为空,结果不是空列表,而是包含空列表的列表,因为空集上只有一个组合,那又是一个空集。此外,对于单身人士,我们将返回一个打包的单身人士名单:

paths []  = [[]]
paths [x] = [[x]]

现在如果我们有更多元素怎么办?我们记住第一个,跳过一两个,然后再对其余部分再次应用paths。但是,如果实际上有什么可以跳过,我们只会跳两次。之后,我们将第一个元素放回到前面:

paths (x:xs)
 | null jump1 = [[x]]
 | otherwise  = map (x:) $ paths jump1 ++ paths jump2
 where jump1 = drop 1 xs
       jump2 = drop 2 xs

示例:

\> paths [2,4,6,8,9,4]
[[2,6,9],[2,6,4],[2,8,4],[2,8]]