Haskell非尾递归

时间:2013-01-16 11:13:04

标签: haskell

我想知道这是否代表尾递归。如果不是我怎么能这样做。

 countP :: [a] -> (a->Bool) -> Int
 countP [] _ = 0
 countP (x:xs) p = countP_aux (x:xs) p 0

 countP_aux [] _ _ = 0
 countP_aux (x:xs) p acumul
                        |p x==True = (countP_aux xs p (acumul))+1
                        |otherwise = (countP_aux xs p (acumul))

  countP [1,2,3] (>0)
  3
  (72 reductions, 95 cells)

此练习显示列表中有多少值由p条件验证。 感谢

1 个答案:

答案 0 :(得分:4)

由于

,这不是尾递归
(countP_aux xs p (acumul))+1

尾调用应返回递归调用的结果,而不是使用递归调用的结果进行计算。

通过使用执行附加工作的累加器,可以将非尾递归函数转换为尾递归,即

假设你有一个简单的计数功能

f a
  | a < 1 = 0 
  | otherwise = f (a-1) + 1

你可以像往常那样使其尾递归:

f' acc a = 
  | a < 1 = acc 
  | otherwise = f' (acc + 1) (a-1)
f = f' 0