理论上可以将每种类型的一般递归转换为尾递归吗?例如,从lambda演算的角度来看它们是等价的吗?这是我与熟人之间的争论。
我的观点是,每次都不可能。例如,如果你有一个递归调用自己两次或三次的函数,那么你就无法将所有递归调用转换为尾调用,对吧?或者总是有办法减少一次递归调用的递归调用次数吗?
答案 0 :(得分:0)
没有。如果你不能重写你的算法只有尾调用,比如在树遍历中,至少有一个调用不在尾部位置。
有些人可能会认为循环+显式堆栈是迭代的,但是IMO它仍然是递归的,并且树遍历将使堆栈增长,就像一般递归一样。