标签: haskell recursion
我有以下Haskell函数,它使用显式递归:
f :: [a] -> [a] f (a:b:xs) = g a b : f (g a b : xs) where g :: a -> a -> a f (_:[]) = [] f [] = []
请注意,递归调用取决于之前步骤中计算的值(g)。
g
有没有办法删除显式递归?若然,怎么做?
答案 0 :(得分:12)
您的功能正好是一个发出中间值的折叠。在Haskell中,这被称为scan。具体而言,scanl1相当于您的f,但第一个元素除外。
f
f = drop 1 . scanl1 g
答案 1 :(得分:-3)
使用尾递归,ghc可以优化它
f (a:b:xs) acc = f (g a b : xs) (g a b : acc) f _ acc = reverse acc
并致电
f myList []