实现Tail Call优化的语言中递归深度的理论/实际限制是什么? (请假设循环函数正确尾调用。)
我的猜测是理论上的限制是NONE,因为没有递归过程,即使它是递归过程。实际限制将是可用的主存储器允许的限制。如果我错了,请澄清或纠正。
答案 0 :(得分:3)
当优化尾递归函数时,它实际上将成为迭代函数。编译器重新使用原始调用的堆栈帧进行后续调用,因此不会耗尽堆栈空间。 如果你没有分配任何堆内存(或任何其他类型的内存不在堆栈中,那么),你可以有无限深度(只要你足够耐心;))递归(把它想象成一个无限循环;它具有相同的特征)。
总结一下,没有实际限制。
答案 1 :(得分:1)
除了@Mehrdad Afshari所写的内容之外,我只想指出尾部递归(或者更一般地说是一系列尾调用)可能是无限的非常重要,因为否则你无法写一个Web服务器,操作系统,解释器,REPL,或者功能语言中的任何事件处理循环。
毕竟,操作系统只不过是一个无限循环,而在函数式语言中编写循环的方法是使用尾递归。如果尾递归不是无限的,那么循环就不会是无限的。因此,您不仅不能编写操作系统,语言甚至不会图灵完备。
基本上,这就是用函数式语言编写Web服务器的方法:
def loop(queue) = {
// handle first request in queue
loop(queue)
}
如果没有无限的尾递归,这将很快耗尽内存。