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

Haskell 尾部递归是否一定需要累加器?,haskell,recursion,tail-recursion,Haskell,Recursion,Tail Recursion,例如,由于以下函数没有累加器,它仍然是尾部递归的吗 belong:: (Ord a) => a -> [a] -> Bool belong a [] = False belong a (h:t) | a == h = True | otherwise = belong a t 函数中的所有计算都是在递归调用之前处理的,这是认为尾部递归的充分条件吗?尾部递归不一定需要累加器。累加器用于尾部递归,作为通过递归调用链向下传递部分结果的一种方式,而不需要在递归的每个

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

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

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

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

belong:: (Ord a) => a -> [a] -> Bool
belong a [] = False
belong a (h:t) 
    | a == h = True
    | otherwise = belong a t
您提供的函数确实是尾部递归的,但它不需要或不使用累加器。当在列表中搜索一个元素时,递归不需要记住到目前为止它所查看的所有元素都不等于要搜索的特定元素。它只需要知道要查找的元素和要搜索的列表


希望这有帮助

不一定需要累加器。不过,通常使用蓄能器。提示,在维基百科的文章中搜索“累加器”。

帮助很大!很好的解释。尾部递归在严格的语言中是最好的,但在Haskell中,情况有点不同。获取有关此问题的良好信息。