在计算机程序设计中,尾部调用是程序源代码中的一种特殊情况,在这种情况下,函数、子例程或过程通过调用另一个函数而不是简单地传递一个保存返回值的变量来返回一个期望值调用它以提供返回值的函数的结尾或尾部。一些程序...
在计算机程序设计中,尾部调用是程序源代码中的一种特殊情况,在这种情况下,函数、子例程或过程通过调用另一个函数而不是简单地传递一个保存返回值的变量来返回一个期望值调用它以提供返回值的函数的结尾或尾部。一些程序员对尾部调用感兴趣,因为在某些优化或编译器行为下,没有额外的堆栈空间用于存储主函数的代码位置;相反,tail函数用于生成返回值报告,直接返回到调用原始函数的调用点。在使用递归的情况下,使用尾部调用特别有用,因为在递归调用嵌套的情况下,用于存储调用方地址的堆栈空间量虽然使用尾部调用有助于提高程序的速度、内存使用率和效率,但它也可能导致源代码被重组以使调试和跟踪变得困难的情况,尤其是在递归的情况下尾调用的存在很大程度上是由于调用堆栈在大多数计算机程序和系统结构中的工作方式。堆栈就像一堆板,是一种先进后出的数据结构。当调用函数、子程序或过程时,调用的地址称为堆栈帧这意味着一个调用函数a,然后调用函数B的程序将有两个堆栈帧,一个用于函数B,另一个用于函数a函数B执行完毕后,它的堆栈帧从栈顶弹出,执行返回到函数A,当它完成时,它的帧从堆栈中弹出,最后将程序控制返回到最初调用第一个函数的点。当使用尾部调用时,函数中的return语句直接使用另一个函数的返回值作为发送给调用代码的数据,在上面的例子中,如果函数A用return语句直接调用函数B,那么就形成了一个尾部调用,在调用堆栈中,函数B将接收返回地址,而不是函数A和函数B都有堆栈帧从函数A和函数A的堆栈帧将弹出并处理,这意味着函数B将直接将其返回值传递回调用函数A的位置,而不必首先将控制权传递回函数A。这将提高函数调用的速度,并有助于减少堆栈中的信息量。尾部调用的属性可以使它们成为非常有吸引力的选项递归函数。递归函数是一个重复调用自身以计算值的函数,遍历列表数据结构时就是这样。嵌套函数调用不会创建额外的堆栈帧,因此,可以安全地执行非常深层次的递归,而不会立即面临堆栈溢出和可能的程序终止的威胁
-
发表于 2020-08-07 21:19
- 阅读 ( 879 )
- 分类:电脑网络