zoukankan      html  css  js  c++  java
  • 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;
        }
  • 相关阅读:
    找球号(一)
    拦截导弹
    开灯问题
    超级台阶
    小学生算术
    Financial Management
    三角形面积
    另一种阶乘问题
    并发环境下,先操作数据库还是先操作缓存?
    Flask框架Server和RequestHandler的爱恨纠缠
  • 原文地址:https://www.cnblogs.com/lasclocker/p/4889475.html
Copyright © 2011-2022 走看看