无法让我的递归函数与列表一起工作
传递一个列表,例如:[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 = []
但难道不工作,因为递归回传的清单列表中,而不是一个列表。我只是不知道如何将它分配给某个东西并同时返回它。
首先,你做了什么test a = test2 a
?
然后,你不需要(且不应使用)看守这与模式匹配做到这一点:
test [] = [[]]
test (a:al) = (a:al):(test al)
如果你坚持要用守卫,你仍然需要做使它实际上是一个列出清单:
test a
| null a = [[]]
| otherwise = a:(test $ tail a)
(不是列表的列表清单的,因为我曾在我原来的职位...)
我正在尝试使用辅助函数的另一种方法,我想在这种情况下我不需要它。谢谢! –
最后一行应该是'a:(test(tail a))' - 注意输入列表'a'不应该被封装为新的单例列表。 –
@ ThomasM.DuBuisson你当然是对的,谢谢。编辑。 – leftaroundabout
fromNet [] = [[]]
fromNet lst = lst : fromNet (tail lst)
如果你想要去与你的drop 1
的方法,你可以写
test xs = take (1 + length xs) $ iterate (drop 1) xs
稍微搞笑版是
import Data.List
test = (++[[]]) . transpose . zipWith replicate [1..]
哪里码?如果我们看不到你在第一个地方做了什么,我们不能告诉你你做错了什么。 –
我不知道haskell,所以我可能是错的,但我认为你需要检查你想要的情况打印原始列表。 – rohit89