斐波那契数列

写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项。斐波那契数列的定义如下:

F(0) = 0, F(1) = 1
F(N) = F(N - 1) + F(N - 2), 其中 N > 1.

递归

    public int fib(int n) {
        if (n == 0){
            return 0;
        }
        if (n == 1){
            return 1;
        }
        return fib(n-1) + fib(n-2);
    }

采用递归方式解决该问题时间复杂度很高:O(2^n)

动态规划

1.在递归过程中存在重叠子问题
初始化dp表:dp[0] = 0;dp[1] = 1;
状态转移方程:dp[n] = dp[n-1]+dp[n-2];

    public int Fibonacci(int n) {
       int[] dp = new int[n+1];
       if (n == 0){
           return 0;
       }
       dp[0] = 0;
       dp[1] = 1;
       for (int i = 2;i <= n; i++){
           dp[i] = dp[i-1]+dp[i-2];
       }
       return dp[n];
    }

动态规划空间复杂度优化

当前状态只与几个状态有关时,可以不建立全部的dp表,减少空间复杂度

public int Fibonacci(int n) {
       if (n == 0){
           return 0;
       }
       int pre0 = 0,pre1 = 1,ans = 1;
       for (int i = 2; i <= n; i++){
           ans = pre1 + pre0;
           pre0 = pre1;
           pre1 = ans;
       }
       return ans;
    }

你可能感兴趣的:(斐波那契数列)