递归-需要满足三个条件
创始人
2024-05-29 01:27:37
0

一,概述

递归是一种应用非常广泛的算法(或者编程技巧)。很多数据结构和算法的编码实现都要用到递归,比如 DFS 深度优先搜索、前中后序二叉树遍历等。

去的过程叫“递”,回来的过程叫“归”。基本上所有的递归问题都可以用递推公式来表示。

递归需要满足的三个条件

  1. 一个问题的解可以分解为几个子问题的解;
  2. 这个问题与分解之后的子问题,除了数据规模不同,求解思路完全一样;
  3. 存在递归终止条件。

二,常见的递归问题

  • 斐波那契数列:递推公式:f(n) = f(n-1) + f(n-2)
  • 跳台阶问题:递推公式:f(n) = f(n-1) + f(n-2)

斐波那契数列问题的”记忆化递归“实现代码如下:

// 1,直接递归会超出时间限制,需要使用记忆化递归
int fib(int n) {if (n == 0) return 0;if (n == 1 || n == 2) return 1;if (vec[n] != -1) return vec[n];vec[n] = (fib(n - 1) + fib(n - 2)) % mod;return vec[n];
}

二,如何编写递归代码

递归问题的层层调用分析是不符合人类直觉的,因此没必要用人脑去分解递归代码的每个步骤,正确的做法是,遇到递归问题就拆分问题并抽象成递归公式,然后再推敲终止条件,最后将递推公式和终止条件翻译成代码。

三,递归代码要警惕堆栈溢出

递归代码涉及到函数调用,函数调用会使用栈来保存临时变量。每调用一个函数,都会将临时变量封装为栈帧压入内存栈,等函数执行完成返回时,才出栈。系统栈或者虚拟机栈空间一般都不大。如果递归求解的数据规模很大,调用层次很深,一直压入栈,就会有堆栈溢出的风险。

通过在代码中限制递归调用的最大深度的方式一定程度上可以解决堆栈溢出的问题。伪代码如下:


// 全局变量,表示递归的深度。
int depth = 0;int f(int n) {++depth;if (depth > 1000) throw exception;if (n == 1) return 1;return f(n-1) + 1;
}

但这种做法并不能完全解决问题,因为最大允许的递归深度跟当前线程剩余的栈空间大小有关,事先无法计算。如果实时计算,代码过于复杂,就会影响代码的可读性。所以,如果最大深度比较小,比如 10、50,就可以用这种方法,否则这种方法并不是很实用。

四,递归代码要警惕重复计算

为了避免重复计算,我们可以通过一个数据结构(比如散列表)来保存已经求解过的 f(k)f(k)f(k)。当递归调用到 f(k)f(k)f(k) 时,先看下是否已经求解过了。如果是,则直接从散列表中取值返回,不需要重复计算。

这种”递归+备忘录(记忆化递归)“的方法相比简单的递归,可以减少时间复杂度,本质是用空间换时间。

五,总结

递归是一种非常高效、简洁的编码技巧。只要是满足“三个条件”的问题就可以通过递归代码来解决。

但是递归代码也比较难写、难理解。编写递归代码的关键就是不要把自己绕进去,正确姿势是写出递推公式,找出终止条件,然后再翻译成递归代码。

递归代码虽然简洁高效,但是,递归代码也有很多弊端。比如,堆栈溢出、重复计算、函数调用耗时多、空间复杂度高等,所以,在编写递归代码的时候,一定要控制好这些副作用。

参考资料

《数据结构与算法之美》-递归

相关内容

热门资讯

追光的你|总书记赞扬他们是“顶...   千工易寻,一匠难求。  2024年3月5日,在十四届全国人大二次会议江苏代表团审议现场,一场关于...
“学跳水为求生,馋兔头念家味”... 01:12封面新闻记者 刘恪生5月4日,在世界泳联跳水世界杯女子三米板跳水决赛中,四川自贡藉运动员陈...
广西一男子独自野钓不慎坠入34... 5月1日下午4时许,来宾市忻城县欧洞乡里苗村廷脚屯,一名男子独自前往附近水坑钓鱼,不料在下坑过程中意...
台商“古早味”灶火煨出两岸食客... 来源:中国新闻网 中新社西安5月4日电 题:台商“古早味”灶火煨出两岸食客共鸣作者 杨英琦“‘古早味...
马斯克,新消息! 美国太空探索技术公司(SpaceX)火箭制造与发射基地所在的得克萨斯州南部墨西哥湾沿岸地区于5月3日...
“五一”假期前三天北京口岸入境... 中新社北京5月4日电 (记者 徐婧)北京出入境边防检查总站(简称“北京边检总站”)4日介绍,5月1日...
贡献青春力量 书写人生华章   国家的希望在青年,民族的未来在青年。无论过去、现在还是未来,青年始终是实现中华民族伟大复兴的先锋...
服务时长累计超8000小时!超... 转自:扬子晚报扬子晚报网5月4日讯(通讯员 玄萱 记者 董婉愉 闫春旭)在五四青年节来临之际,南京玄...
17家城商行去年年报盘点:西安... 17家A股上市城商行2024年年报已全部出炉。从营收看,2024年,17家A股上市城商行中,有14家...
贵州省进一步规范居民水电气计量...   5月4日,从贵州省市场监管局网获悉,为进一步规范供水、供电、供气行业收费行为,确保居民水表、电能...
期待“文学春天盛典” 转自:中国吉林网   5月15日,以“书香向北 阅见未来...
演员扎堆音乐节,是丰富了舞台还... 今年上半年,全国各地的音乐节如火如荼进行中,有意思的是,其中不乏多位流量演员的加入,如赵露思、丁禹兮...
贵州发生游船侧翻事故,约70人... 据新华社5月4日消息,贵州省黔西市新仁苗族乡六冲河东风库区附近发生载人游船侧翻事故。当天下午4时许,...
“五一”假期接近尾声 这份安全... 转自:央视“五一”假期接近尾声不少小伙伴已踏上归途今起将迎返程高峰央视新闻送大家一份安全提醒愿您旅途...
出口托举香港一季度GDP增3.... 受惠于出口增长创下三年来最高纪录等影响,中国香港特区一季度本地生产总值(GDP)迎来“开门红”,其预...
南京北站假期不停工 超级枢纽加... 转自:经济日报图为五一假期南京北站建设现场。资料图片“五一”假期期间,南京北站施工现场塔吊林立、机械...
广交会观察:从代加工到品牌出海... 中新社广州5月4日电 (记者 程景伟)作为中国外贸的“晴雨表”和“风向标”,广交会持续展现中国企业出...
贵州黔西载人游船侧翻,约70人... 据新华社消息,贵州省黔西市新仁苗族乡六冲河东风库区附近发生载人游船侧翻事故。5月4日下午4时许,位于...
太湖湾音乐节组委会声明罗云熙工... 【#太湖湾音乐节组委会声明##罗云熙工作室回应音乐节争议#】太湖湾音乐节组委会5月4日发表声明:关于...
完美收官!跳水世界杯中国包揽全... 转自:草原云5月4日,2025年世界泳联跳水世界杯总决赛在北京国家游泳中心进入最后一个比赛日争夺。在...