我想知道这是否代表尾递归。如果不是我怎么能这样做。
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条件验证。 感谢
答案 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