在 数据结构与算法-回文(动态规划、快慢指针) 中我们总结了动态规划的技巧,这篇文章主要是总结递归的技巧,并给出例子。实际上DP和递归思路上基本上都是三步走策略,还是很相似的。
详细原文章来自:https://mp.weixin.qq.com/s/mJ_jZZoak7uhItNgnfmZvQ
递归的三大要素
1.定义函数的功能,明确函数想要干什么
2.找到初始值,即寻找递归结束的条件
3.找到关系式
例题
案例1:斐波那契数列
斐波那契数列的是这样一个数列:1、1、2、3、5、8、13、21、34….,即第一项 f(1) = 1,第二项 f(2) = 1……,第 n 项目为 f(n) = f(n-1) + f(n-2)。求第 n 项的值是多少。
- 明确函数想要干什么
- 找到递归结束的条件
- 找到关系式
案例2:小青蛙跳台阶
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
案例3:反转单链表
记得之前的 数据结构与算法-链表必写题汇总(快慢指针、哨兵等) 也有这题,但是那题中我们使用一个指针即可解决,但实际上的话也可以使用递归的方法进行解决。这题还和 剑指Offer3-从尾到头打印链表 比较相似,对于从尾到头打印链表问题,我们在这里并不需要反转单链表,所以两题还是有区别的。但是都可以通过递归的方法进行解决。以下是解题思路:
反转单链表。例如链表为:1->2->3->4。反转后为 4->3->2->1
但这里函数反转链表的功能,仅仅是反转当前节点!
具体动图可以进这里看一下:https://leetcode-cn.com/problems/reverse-linked-list/solution/dong-hua-yan-shi-206-fan-zhuan-lian-biao-by-user74/
3.关系式