DP思想在斐波那契数列递归求解中的应用

斐波那契数列:1, 1, 2, 3, 5, 8, 13,...,即 f(n) = f(n-1) + f(n-2). 求第n个数的值。

方法一:迭代

    public static int iterativeFibonacci(int n) { //简单迭代
        int a = 1, b = 1;
        for(int i = 2; i < n; i ++) {
            int tmp = a + b;
            a = b;
            b = tmp;
        }
        return b;
    }

方法二:简单递归

    public static long recursionFibonacci(long n) { // 简单递归
        if(n == 1 || n == 2) return 1;
        return recursionFibonacci(n-1) + recursionFibonacci(n-2);
    }

方法三:利用DP思想对方法二进行改进,即使用一个数组存储每次计算出的结果,防止重复计算。

    public static int recursionDPFibonacci(int n, int[] array) { //利用一个数组保存已经计算出的结果,防止下次重复计算。
        if(n == 1 || n == 2) return 1;
        if(array[n] == 0)
            array[n] = recursionDPFibonacci(n-1, array) + recursionDPFibonacci(n-2, array);
        return array[n];
    }

下面给出测试代码:

    public static void main(String[] args) {
        int[] array = new int[44]; //433494437
        System.out.println(Main.recursionDPFibonacci(43, array)); 
    }

 关于斐波那契数列,有一个爬楼梯的问题,一层楼一共n个台阶,已知一次只能上一个台阶或者上两个台阶,问一共有多少种方式能爬到楼顶?

分析:通过找规律,发现:

n = 1,  1种;

n = 2,  2种;

n = 3,  3种;

n = 4,  5种;

n = 5,  8种;

即f(n) = f(n-1) + f(n-2).

代码如下:

    public int climbStairs(int n) {
        if(n <= 2) return n;
        int a = 1, b = 2;
        for(int i = 2; i < n; i++) {
            int tmp = a + b;
            a = b;
            b = tmp;
        }
        return b;
    }
原文地址:https://www.cnblogs.com/lasclocker/p/4889475.html