今天在刷算法时,遇到尾递归的概念,之前也看到过,但是没有深究,只知道尾递归效率高。今天学习了一下.
什么是尾递归:
尾递归的定义很简洁: 递归语句是函数的最后一条语句
为什么高效?
我们知道操作系统使用堆栈来处理递归,对于一般的递归,操作系统要在堆栈上新建一个栈帧
来存储当前调用函数的数据,比如局部变量、现场信息、返回地址等。每递归一次就新建一个栈帧,压到栈顶。如果处理很深的递归或函数处理数据很大时,很有可能造成栈溢出。
而对于尾递归,编译器会作出一些优化。即若编译器发现这次递归是尾递归,它不会去新建一个栈帧,而是用当前函数的信息覆盖掉栈顶栈帧中的信息。之所以能这么做是因为递归语句位于函数的最后,前面的计算工作都已经完成了,不用保存中间结果。这样一来省去了创建栈帧的开销;二来避免了栈溢出。
程序测试

上图两个阶乘函数,第一个不是尾递归,第二个是尾递归。计算10!,二者差了0.00002s。如果计算量很大时,差异可能就会明显起来。
网友评论