f
(
6
)
f(6)
f(6),就需要先计算出子问题
f
(
5
)
f(5)
f(5) 和
f
(
4
)
f(4)
f(4)
然后要计算f
(
5
)
f(5)
f(5),又要先算出子问题
f
(
4
)
f(4)
f(4) 和
f
(
3
)
f(3)
f(3),以此类推。
一直到f
(
2
)
f(2)
f(2) 和
f
(
1
)
f(1)
f(1),递归树才终止。
因此,青蛙跳阶,递归解法的时间复杂度 等于O
(
1
)
∗
O
(
2
n
)
=
O
(
2
n
)
O(1) * O(2^n) = O(2^n)
O(1)∗O(2n)=O(2n)
你仔细观察这颗递归树,你会发现存在「大量重复计算」;
比如f
(
4
)
f(4)
f(4)被计算了两次,
f
(
3
)
f(3)
f(3)被重复计算了3次…所以这个递归算法低效的原因,就是存在大量的重复计算!
所以我们可以对代码进行优化
🍅 递归升级
在递归法的基础上,新建一个长度为
n
n
n 的数组,用于在递归时存储
f
(
0
)
f(0)
f(0) 至
f
(
n
)
f(n)
f(n) 的数字值,重复遇到某数字时则直接从数组取用,避免了重复的递归计算。
所以我们设置一个数组,用于存放第一次计算某一个n
n
n的
jump(n)
。
当每一次要计算一个jump(n)
的时候,就先查看数组中以n
n
n 为下标的地方是否有值,有的话就可以不调用
jump(n)
,而直接从数组中取得结果值,否则再计算jump(n)
。
📝代码实现
#include <stdio.h>
long int f[1000]={0};
int jump(int n){
//当只有一阶台阶的时候,只有一种上台阶的方式。
//当有2阶台阶的时候,有2种上台阶的方式,一种是一次上一阶,还有一种是一次上2个台阶。
//现在设有n阶台阶,如果n>2,那种应该有&