栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java0基础

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java0基础

标签:递归算法

 1.递归定义:直接/简介调用自身方法的过程

2.递归优点:简单、优雅

3.递归思想:将问题规模减少,划分为同类型但规模减少的子问题

4.递归关键:递归出口

5.递归本质:函数重复调用自身,将其压栈至初始条件最后弹栈至空的过程。

6.递归举例:


7.递归辅助方法

有时,我们对递归进行改进,使其更为简便,尤其适用于数组和字符串问题。

本质上,递归辅助方法是重载的带额外参数的递归方法

 


8.递归模板

如上图所示,递归包括两个要点,即递归出口和递归返回关联,通常通过if-else-if-else进行调整,if语句写出递归终止条件,如上图的left>right,然后用剩下的分支进行判断,返回。


9.递归优化

如何减少递归的复杂度呢?

方法1:尾递归

尾递归即递归方法调用完成后无其他任何操作,形式上看即return 递归方法名,而非尾递归还有其他操作,就会导致在当前调用栈中暂存递归返回的结果,占用了内存空间,尤其是递归深度较大时会消耗栈空间,故建议将其他形式的递归→尾递归方式。

如上图所示为 一般写法,即引入暂存结果的辅助参数result,不难发现,FacNew方法是尾递归,而原有的Fac调用了FacNew方法,这样就实现了尾递归。

【注意】可能你想问为何不直接修改Fac,其实可以,但是对于使用者而言,需求是给出数字n计算其阶乘,这样直接写对用户体验性不够好,建议封装为尾递归方式。

【注意】前面的二分查找,我们通过加入low和high参数实现了尾递归。


方法2:修改为非递归方式,即采用迭代等方法修改,如下所示为计算阶乘的迭代方式:


 

 10.递归总结

当然,递归非常简便、直接和优雅,常用于汉诺塔等复杂问题给出清晰的思路,但是其时间复杂度和空间复杂度非常高,调用堆栈开销很大,故非必要,不要使用递归!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/459378.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号