例如,由于下面的函数没有累加器,它仍然是尾递归的吗?
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
函数中的所有计算都是在递归调用之前处理的,是否认为是尾递归的充分条件?
尾递归不一定需要累加器。累加器用于尾递归,作为通过递归调用链向下传递部分结果的一种方式,而无需在递归的每个级别使用额外的空间。例如,规范尾递归阶乘函数需要一个累加器来传播到目前为止建立的部分乘积。但是,如果您不需要从递归调用向下传递任何信息到其子调用,则不需要累加器。
您提供的函数确实是尾递归的,但它不需要或使用累加器。在列表中搜索元素时,递归不需要记住到目前为止它查看的所有元素都不等于正在搜索的特定元素。它只需要知道要查找的元素和要搜索的列表。
希望这可以帮助!
尾递归不一定需要累加器。但是,经常使用蓄能器。提示,在维基百科文章中搜索“累加器”。