【问题标题】:Limit to the recursion depth in tail recursion in languages implementing TCO?限制实现 TCO 的语言中尾递归的递归深度?
【发布时间】:2009-05-15 11:04:50
【问题描述】:

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

我的猜测是理论上的限制是 NONE,因为没有递归过程,即使它是递归过程。实际限制将是可用的主存储器允许使用的限制。如果我在某处错了,请澄清或更正。

【问题讨论】:

    标签: recursion tail-recursion


    【解决方案1】:

    当尾递归函数被优化时,它本质上会变成一个迭代函数。编译器将原始调用的堆栈帧重用于后续调用,因此您不会用完堆栈空间。 如果你没有分配任何堆内存(或者任何其他类型的不在堆栈上的内存,就此而言),你可以有无限深的(只要你有足够的耐心;))递归(把它想象成一个无限循环;它具有相同的特征)。

    总而言之,没有实际限制。

    【讨论】:

    • 我目前正在等待 (waiting for (factorial 10000000000) 完成:)
    • @Amit 你还在等吗?还是你放弃了。我想这需要一些时间。
    【解决方案2】:

    除了@Mehrdad Afshari 写的内容之外,我只想指出,尾递归(或更一般地说,尾调用链)可能是无限的,因为否则你无法编写Web 服务器、操作系统、解释器、REPL 或任何类型的函数式语言的事件处理循环。

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

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

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

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

    【讨论】:

    • +1 虽然大多数人不会在 Scheme 中编写自己的 Web 服务器,但 TCO 是这种语言可用性的关键部分,在这种语言中迭代要么困难要么不可能。
    猜你喜欢
    • 2012-01-04
    • 2020-08-06
    • 1970-01-01
    • 2016-03-02
    • 2012-10-26
    • 1970-01-01
    • 2019-04-07
    • 2011-02-07
    • 2015-06-10
    相关资源
    最近更新 更多