函数的尾部上下文是什么?

时间:2016-08-05 04:50:16

标签: recursion tail-recursion

在讲座中,我将尾调用定义为一个调用表达式,它出现在尾部上下文中。我在The Revised Report on the Algorithmic Language Scheme中查找了尾部上下文的定义:

  

尾调用是在尾部上下文中发生的过程调用。尾部上下文是归纳的。请注意,尾部上下文始终根据特定的lambda表达式确定。

我觉得这并没有真正明确说明尾部背景是什么,有人会给出一个初学者可能更容易理解的解释吗?

1 个答案:

答案 0 :(得分:1)

尾部是动物功能的最后一端。直观地说,如果函数除了将评估结果返回给调用者之外什么都不做,那么评估就会发生在尾部上下文中。

关于尾部上下文的关键观察是呼叫帧中不需要任何内容​​(除了对调用者的引用之外),允许调用帧由尾部上下文中执行的调用重用。这样做可以将一些递归算法的空间要求从O(N)更改为O(1),或者在快速排序算法不完美分区的情况下将O(log N)更改。

程序流分析可以识别回收调用帧的其他可能机会,但在许多语言中,尾部上下文可以通过简单的语法分析来识别。在Scheme的情况下,该过程在语言文档中指定,链接在原始帖子中。如果可以通过这种方式识别尾部调用,则Scheme需要优化尾部调用。

在许多其他语言中,不需要尾调用优化,在某些情况下甚至不可能。例如,在C ++中,可能存在需要在最后一次调用之后和返回之前运行的隐式析构函数;此外,返回的值可能需要转换为其他类型。在调用框架可用于内省的语言中(例如,Javascript),调用框架回收将修改可观察的程序行为。