斐波那契数列指的是这样一个数列: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(1)]和dp(0),而这些初始状态是已知的,dp(0)=1和dp(1)=1
动态规范实现,优化递归实现:从下往上,用数组记录下计算的值,不停的向上累加,不会导致重复计算
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<n;i++) {
dp[i]=dp[i-1]+dp[i-2];
}
return dp[n-1];
}
关键的地方:一维数组,递推公式;从上往下被转化成从下往上