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

use*_*813 8 recursion haskell tail-recursion

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

belong:: (Ord a) => a -> [a] -> Bool
belong a [] = False
belong a (h:t) 
    | a == h = True
    | otherwise = belong a t
Run Code Online (Sandbox Code Playgroud)

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

tem*_*def 10

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

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

希望这可以帮助!