当前位置:   article > 正文

什么是尾递归/尾递归的底层实现原理_所有递归都可以改写为尾递归吗

所有递归都可以改写为尾递归吗
什么是尾递归/尾递归的底层实现原理

    什么是尾递归?尾递归就是函数最后的语句是调用函数自身,但调用自己的时候,已经
不再需要上一个函数的环境了。所以并非所有的递归都属于尾递归,它需要通过上述的规则来编
写递归代码。和普通的递归相比,尾递归即使递归调用数万次,它的函数栈也仅为常数,不会出
现Stack Overflow异常。

    递归和循环的区别?从jvm的角度来说,递归每增加一层,使用的栈内存都会增加一个栈帧,
也就是说递归是以消耗内存为代价来换取执行速度。循环占用的栈帧是固定的,不会随着循环次
数的增加而增加,但是执行速度会随着循环次数的增加而增加。

    尾递归的优势?尾递归很好的融合了递归和循环的优点,尾递归既融合了递归速度快的优点,
又融合了循环占用内存小的特点。

    尾递归占用的栈帧为什么不会随着递归深度的增加而增加呢?这就要搞清楚尾递归的实现原
理了。尾递归实际上是利用了计算机科学的尾调用,什么是尾调用呢?尾调用指的是一个函数最
后一个操作是函数调用。这句话需要好好回味,感兴趣的朋友可以百度一下,务必先搞清楚什么
是尾调用。好,回到尾递归上来,如果一个函数最后一个操作是调用函数本身,那么这就是尾递
归。

    普通递归与尾递归的本质区别。尾递归在当前栈帧执行完之后,不需要再保留当前栈帧,而
是带着当前栈帧的结果,进入到下一栈帧。这里有兴趣的朋友可以研究一下栈帧的生命周期。普
通的递归则不同了,普通的递归由于当前栈帧还没有执行完,就要调用其他栈帧了,当前栈帧不
能退出,所以普通的递归占有的栈帧会随着递归层次的增加而增加。这就是普通递归和尾递归的
本质区别。

    尾递归算法的价值。尾递归算法巧妙的运用了计算机的尾调用,充分利用了计算机硬件的设
计原理,能够使程序更高效的运行。但是并非所有的递归都可以改写成尾递归,所以实际使用时
还是要具体问题具体分析。在平时的开发工作中,尽量坚持这样一个原则:能用尾递归解决的问
题,坚决不要使用普通的递归。

    文章最后解释一下普通递归和尾递归。尾递归其实是一种特殊的递归。本质上也是递归,
所以本文中的普通递归准确的表述应该是非尾递归的递归。


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/116233
推荐阅读