Recursion 在实现TCO的语言中,是否限制尾部递归的递归深度?

Recursion 在实现TCO的语言中,是否限制尾部递归的递归深度?,recursion,tail-recursion,Recursion,Tail Recursion,在实现尾部调用优化的语言中,递归深度的理论/实践限制是什么?(请假定循环函数已正确地尾部调用) 我的猜测是,理论极限是零,因为没有递归过程,即使它是递归过程。实际限制是可使用的主内存所允许的限制。如果我在某个地方错了,请澄清或纠正。当尾部递归函数被优化时,它本质上会变成一个迭代函数。编译器对后续调用重用原始调用的堆栈框架,因此不会耗尽堆栈空间如果不分配任何堆内存(或者不在堆栈上的任何其他类型的内存),则可以使用无限深(只要您足够耐心;)递归(将其视为无限循环;它具有相同的特性) 总之,没有实际的

在实现尾部调用优化的语言中,递归深度的理论/实践限制是什么?(请假定循环函数已正确地尾部调用)


我的猜测是,理论极限是零,因为没有递归过程,即使它是递归过程。实际限制是可使用的主内存所允许的限制。如果我在某个地方错了,请澄清或纠正。

当尾部递归函数被优化时,它本质上会变成一个迭代函数。编译器对后续调用重用原始调用的堆栈框架,因此不会耗尽堆栈空间如果不分配任何堆内存(或者不在堆栈上的任何其他类型的内存),则可以使用无限深(只要您足够耐心;)递归(将其视为无限循环;它具有相同的特性)


总之,没有实际的限制。

当尾部递归函数被优化时,它本质上会变成一个迭代函数。编译器对后续调用重用原始调用的堆栈框架,因此不会耗尽堆栈空间如果不分配任何堆内存(或者不在堆栈上的任何其他类型的内存),则可以使用无限深(只要您足够耐心;)递归(将其视为无限循环;它具有相同的特性)


总之,没有实际的限制。

除了@Mehrdad Afshari所写的之外,我只想指出,尾部递归(或者更一般地说是一系列尾部调用)可能是无限的,这实际上非常重要,因为否则你无法编写web服务器、操作系统、解释器、REPL,或者函数式语言中的任何类型的事件处理循环

毕竟,操作系统只是一个无限循环,用函数式语言编写循环的方法是使用尾部递归。如果尾部递归不是无限的,那么循环就不是无限的。因此,你不仅不能编写一个操作系统,语言也不会是图灵完整的

基本上,这就是用函数式语言编写web服务器的方法:

def loop(queue) = {
  // handle first request in queue
  loop(queue)
}

如果没有无限的尾部递归,这将很快耗尽内存。

除了@Mehrdad Afshari所写的之外,我只想指出,实际上非常重要的是尾部递归(或者更一般地说是一系列尾部调用)可能是无限的,因为否则您无法编写web服务器、操作系统,解释器、REPL或函数式语言中的任何类型的事件处理循环

毕竟,操作系统只是一个无限循环,用函数式语言编写循环的方法是使用尾部递归。如果尾部递归不是无限的,那么循环就不是无限的。因此,你不仅不能编写一个操作系统,语言也不会是图灵完整的

基本上,这就是用函数式语言编写web服务器的方法:

def loop(queue) = {
  // handle first request in queue
  loop(queue)
}

如果没有无限尾递归,这将很快耗尽内存。

我正在等待(等待(阶乘1000000000)完成:)@Amit您还在等待吗?还是你放弃了。我想这需要一些时间。我正在等待(等待(阶乘1000000000)完成:)@Amit你还在等吗?还是你放弃了。我想这需要一些时间。+1虽然大多数人不使用Scheme编写自己的Web服务器,但TCO是这种语言可用性的一个关键部分,在这种语言中,迭代不是困难就是不可能。+1尽管大多数人不使用Scheme编写自己的Web服务器,TCO是这种语言可用性的关键部分,在这种语言中,迭代是困难的或不可能的。