[英]Haskell list of lists
說我在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)
但它只返回一個列表,從第一個元素開始,然后逐個跳轉。 所以我不知道如何讓它遞歸,以便它跳過兩個和一個所有可能的跳躍。
非常感謝幫助。
你想要跳過一個或兩個元素。 因此,您不僅需要一個,而且需要兩個遞歸調用(如果您想通過遞歸策略解決此問題)。
但首先,讓我們修復你的類型:
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]]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.