说我在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)
但它只返回一个列表,从第一个元素开始,然后按一个跳转。所以我不知道如何让它递归,以便它跳过两个和一个所有可能的跳跃。
非常感谢帮助。
答案 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]]