递归地反转字符串(或列表)

时间:2011-10-05 04:23:04

标签: haskell

我正在尝试在haskell中编写一个函数来递归地反转列表。我写了一个辅助函数,它接受原始列表和一个空列表,然后以LIFO模式将元素从第一个传递到另一个。

这就是我所拥有的:

myreverse :: [a] -> [a]
myreverse list = myflip list []

myflip :: [a] -> [a] -> [a]
myflip list1 newList
    | null list1        = newList
    | otherwise         = myflip (tail list1) ((head list1) : newList)

我知道有一个内置函数可以帮我,但要求是我只使用 head tail elem null (也没有模式匹配)。所以我的问题是:有没有更好的解决方案,我只有一个函数,myreverse,只消耗一个列表? (当然,这符合上述要求)

谢谢!

5 个答案:

答案 0 :(得分:7)

您可以尝试使用foldl来反转列表,如下所示:

reverse' :: [a] -> [a]  
reverse' = foldl (\acc x -> x : acc) [] 

答案 1 :(得分:0)

此功能满足您的要求,但效率低下:

rev xs = if null xs then xs else rev (tail xs) ++ [head xs]

你的解决方案一点都不差。使用模式匹配并使myFlip成为本地函数后,它看起来不会很难看。使用带累加器的局部函数的技术非常普遍(尽管不是在这种简单的情况下)。

答案 2 :(得分:0)

除了满足您的额外要求所需的调整之外,您的功能与reverse is implemented in GHC的方式相同。因此,我认为你的功能非常好。

答案 3 :(得分:0)

所以对于任何可能感兴趣的人来说,这就是我最后写的:

myreverse :: [a] -> [a]
myreverse list = myflip list []
    where myflip list newList = if null list then newList
                                else myflip (tail list) ((head list):newList)

感谢大家的意见和建议。

答案 4 :(得分:0)

将此内容保存为reverse.hs文件

 reverseString :: [Char] -> [Char]
 reverseString [] = []
 reverseString (x:xs) = reverseString xs ++ [x]

然后运行 reverseString“ abc”

  

cba