尾递归是否一定需要累加器?

时间:2012-12-18 19:47:14

标签: haskell recursion tail-recursion

例如,由于以下函数没有累加器,它是否仍然是尾递归的?

belong:: (Ord a) => a -> [a] -> Bool
belong a [] = False
belong a (h:t) 
    | a == h = True
    | otherwise = belong a t

函数中的所有计算都是在递归调用之前处理的,它是否被认为是尾递归的充分条件?

2 个答案:

答案 0 :(得分:10)

尾递归不一定需要累加器。累加器用于尾递归,作为通过递归调用链向下传递部分结果的方式,而不需要在递归的每个级别使用额外的空间。例如,规范尾递归因子函数需要累加器来传播到目前为止构建的部分乘积。但是,如果您不需要将递归调用中的任何信息传递给它的子查询,则不需要累加器。

您提供的函数确实是尾递归,但它不需要或使用累加器。在列表中搜索元素时,递归不需要记住它到目前为止所查看的所有元素都不等于要搜索的特定元素。它只需要知道要查找的元素以及要搜索的列表。

希望这有帮助!

答案 1 :(得分:0)

Tail recursion不一定需要累加器。但是经常使用累加器。提示,在维基百科文章中搜索“累加器”。