斐波那契数列指的是这样一个数列: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];
}

关键的地方:一维数组,递推公式;从上往下被转化成从下往上