什么是尾递归/尾递归的底层实现原理

什么是尾递归/尾递归的底层实现原理

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

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

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

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

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

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

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


  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值