斐波那契数列是这样一个数列:1.1.2.3.5.8.13.21.34.....
这个数列从第3项开始,每一项都等于前两项之和,用方程表示:dp[i]=dp[i-1]+dp[i-2];
原始递归实现:
public long dp(int n) {
if(n==0||n==1) return 1;
else {
return dp(n-1)+dp(n-2);
}
}
从上往下看,不停的递归调用自己,导致大量的重复计算;
如dp(10)=dp(9)+dp(8) ,
dp(9)=dp(8)+dp(7),
dp(8)=dp(7)+dp(6),
.....
层层递推,最终递推到dp(1)和dp(0),其结果就是N多个dp(1)和dp(0)之和,而初始状态dp(1)和dp(0)的值是已知的,即dp(0)=1和dp(1)=1。
可以看到,上面存在大量的重复计算,dp(3)要计算dp(1)和dp(0)的和,dp(4)要计算dp(1)和dp(0),dp(5)也要计算dp(1)和dp(0).....
如果能把dp(3)、dp(4)、dp(5)的值缓存起来,那dp(6)就可以直接算出值了,不用再递归到dp(1)和dp(0)求和
优化递归方法-动态规化:从下往上,用一维数组缓存计算好的值,不停的向上累加
public int fibonacci(int n) {
if(n<=0)return 0;
if(n==1||n==2)return 1;
int dp[] = new int[n];
dp[0]=1;
dp[1]=1;
for(int i=2;i
dp[i]=dp[i-1]+dp[i-2];
}
return dp[n-1];
}
递归从上往下导致大量的重复计算,动态规划从下往上,多了个一维数组存之前计算好的值,没有多余的计算过程