在讲座中,我将尾调用定义为一个调用表达式,它出现在尾部上下文中。我在The Revised Report on the Algorithmic Language Scheme中查找了尾部上下文的定义:
尾调用是在尾部上下文中发生的过程调用。尾部上下文是归纳的。请注意,尾部上下文始终根据特定的lambda表达式确定。
我觉得这并没有真正明确说明尾部背景是什么,有人会给出一个初学者可能更容易理解的解释吗?
答案 0 :(得分:1)
尾部是动物功能的最后一端。直观地说,如果函数除了将评估结果返回给调用者之外什么都不做,那么评估就会发生在尾部上下文中。
关于尾部上下文的关键观察是呼叫帧中不需要任何内容(除了对调用者的引用之外),允许调用帧由尾部上下文中执行的调用重用。这样做可以将一些递归算法的空间要求从O(N)更改为O(1),或者在快速排序算法不完美分区的情况下将O(log N)更改。
程序流分析可以识别回收调用帧的其他可能机会,但在许多语言中,尾部上下文可以通过简单的语法分析来识别。在Scheme的情况下,该过程在语言文档中指定,链接在原始帖子中。如果可以通过这种方式识别尾部调用,则Scheme需要优化尾部调用。
在许多其他语言中,不需要尾调用优化,在某些情况下甚至不可能。例如,在C ++中,可能存在需要在最后一次调用之后和返回之前运行的隐式析构函数;此外,返回的值可能需要转换为其他类型。在调用框架可用于内省的语言中(例如,Javascript),调用框架回收将修改可观察的程序行为。