斐波那契数列
之前的例子是每个递归函数只包含一个自身的调用,这称之为 single recursion
如果每个递归函数例包含多个自身调用,称之为 multi recursion
递推关系
下面的表格列出了数列的前几项
实现
public static int f(int n) {
if (n == 0) {
return 0;
}
if (n == 1) {
return 1;
}
return f(n - 1) + f(n - 2);
}
执行流程
-
绿色代表正在执行(对应递),灰色代表执行结束(对应归)
-
递不到头,不能归,对应着深度优先搜索
时间复杂度
变体1 - 兔子问题
第一个月,有一对未成熟的兔子(黑色,注意图中个头较小)
第二个月,它们成熟
第三个月,它们能产下一对新的小兔子(蓝色)
所有兔子遵循相同规律,求第 n 个月的兔子数
分析
兔子问题如何与斐波那契联系起来呢?设第 n 个月兔子数为 f(n)
f(n) = 上个月兔子数 + 新生的小兔子数
而【新生的小兔子数】实际就是【上个月成熟的兔子数】
因为需要一个月兔子就成熟,所以【上个月成熟的兔子数】也就是【上上个月的兔子数】
上个月兔子数,即 f(n-1)
上上个月的兔子数,即 f(n-2)
因此本质还是斐波那契数列,只是从其第一项开始
变体2 - 青蛙爬楼梯
楼梯有 n 阶
青蛙要爬到楼顶,可以一次跳一阶,也可以一次跳两阶
只能向上跳,问有多少种跳法
分析
-
因此本质上还是斐波那契数列,只是从其第二项开始
-
对应 leetcode 题目 70. 爬楼梯 - 力扣(LeetCode)