递归-需要满足三个条件
创始人
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) 时,先看下是否已经求解过了。如果是,则直接从散列表中取值返回,不需要重复计算。

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

五,总结

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

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

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

参考资料

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

相关内容

热门资讯

首批被拘留者抵达美“鳄鱼恶魔岛... 据新华社北京7月4日电 美国媒体3日援引佛罗里达州官员说法报道,首批被拘留者已抵达该州南部一处新设的...
解密A股“游戏之王”:被ST后...   一家被ST的公司市值居然能高达886.9亿元,在A股总市值排名中位列第155名。更令人惊讶的是,...
普利特预计上半年归母净利润同比... 7月4日,普利特(维权)(002324)发布公告,预计2025年1月1日至2025年6月30日的业绩...
悄然推出无糖版新品,东鹏特饮要... 来源:品饮汇观察7月初,东鹏饮料的天猫旗舰店悄然上架了一款战略级新品——“无糖型东鹏特饮能量饮料”。...
曾林峰出任北京市地方金融管理局... 文|《财经》研究员 程维妙 编辑|张颖馨  曾林峰到任后,北京市地方金融管理局新班子形成。该局官网显...
图解丨稳投资、扩消费、促转型、... 转自:光明网  今年以来,“两新”政策持续显效,稳投资、扩消费、促转型、惠民生的关键作用进一步凸显,...
天气再热 也不能“热”上头 转自:扬子晚报扬子晚报网7月4日讯 (通讯员 李誉 钱晶玉 记者 王国柱)“多亏你们耐心调解,成功帮...
以伟大建党精神引领新时代党的作... 进一步弘扬伟大建党精神,以更高的标准、更严的要求加强党的作风建设。中共中央政治局6月30日下午就健全...
试运行启动!深圳13号线一期北... (转自:搜狐焦点深圳) 深圳地铁13号线再传好消息!7月4日,深圳市轨道交通13号线一期工程北段试运...
重庆九五医院开展“夏季防暑降温... 来源:环球网 夏季伊始,滚滚热浪席卷山城,重庆市气象台持续发布高温红色预警,多地气温突破37℃,室外...