2011-09-28 40 views
0

传递一个列表,例如:[1,2,3,4,5] 并返回[[1,2,3,4,5], [2,3,4,5],[3,4,5],[4,5],[5],[]]无法让我的递归函数与列表一起工作

我的方法是使用递归将drop 1 list添加到另一个空列表,直到列表为空。但我似乎无法让我的递归正常工作。

帮助,请,谢谢

到目前为止我的代码:

test a = test2 a where 
test2 a | size(a) > 1 = test (drop 1 a):[] 
     | otherwise = [] 

但难道不工作,因为递归回传的清单列表中,而不是一个列表。我只是不知道如何将它分配给某个东西并同时返回它。

+4

哪里码?如果我们看不到你在第一个地方做了什么,我们不能告诉你你做错了什么。 –

+0

我不知道haskell,所以我可能是错的,但我认为你需要检查你想要的情况打印原始列表。 – rohit89

回答

7

首先,你做了什么test a = test2 a

然后,你不需要(且不应使用)看守这与模式匹配做到这一点:

test [] = [[]] 
test (a:al) = (a:al):(test al) 

如果你坚持要用守卫,你仍然需要做使它实际上是一个列出清单:

test a 
    | null a = [[]] 
    | otherwise = a:(test $ tail a) 

(不是列表的列表清单的,因为我曾在我原来的职位...)

+0

我正在尝试使用辅助函数的另一种方法,我想在这种情况下我不需要它。谢谢! –

+0

最后一行应该是'a:(test(tail a))' - 注意输入列表'a'不应该被封装为新的单例列表。 –

+0

@ ThomasM.DuBuisson你当然是对的,谢谢。编辑。 – leftaroundabout

0
fromNet [] = [[]] 
fromNet lst = lst : fromNet (tail lst) 
1

如果你想要去与你的drop 1的方法,你可以写

test xs = take (1 + length xs) $ iterate (drop 1) xs 

稍微搞笑版是

import Data.List 

test = (++[[]]) . transpose . zipWith replicate [1..]