我刚开始学习Haskell,如果我的问题很傻,请见谅。我正在阅读learnyouahaskell.com的第五章“递归”。其中有一个标准‘reverse’函数实现的例子:
reverse' :: [a] -> [a]
reverse' [] = []
reverse' (x:xs) = reverse' xs ++ [x]
但似乎它的运行时间是O(N^2),而标准的反转是O(N)(我希望是这样)。以下代码说明了这一点:
sum (reverse [1,2..1000000]) -- runs pretty fast
sum (reverse' [1,2..1000000]) -- never finishes
所以,我开始思考如何更快地实现自己的反转。在命令式语言中做这件事很容易。也许我需要一些更高级的材料来完成这个任务?欢迎任何提示。
foldl
的经典堆栈问题的影响? - Elliot Cameronfoldr
的情况,但不是foldl
。 - symbiont