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;
    }
时间: 2024-07-30 10:15:47

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

递归思想之---斐波拉契数列

斐波那契数列中的递归思想 ??如果上述的分析都明白了,那就说明你已掌握了递归,但为了加深对递归的理解,我们再来看一个思考题(来自程序员的数学思考题),题目是这样的,假如动物中有一种特殊的种类,它出生2天后就开始以每天1只的速度繁殖后代.假设第1天,有1只这样的动物(该动物刚出生,从第3天开始繁殖后代).那么到第11天,共有多少只呢? 我们先来按一般顺序思考,先不要考虑第11天,先从第1天开始,看能不能找出规律: [第1天]只有1只动物 [第2天]只有1只动物,还没有繁殖后代,总量为1 [第3天]

斐波那契数列递归内存溢出如何解决

斐波那契数列指的是这样一个数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368........某一项是前两项的和.使用递归调用时前四十项求解没有问题,但到底五十项的时候会出现内存溢出,求不出结果.所以要想求出更多的项必须使用非递归的方法求解,数据类型不能再是int,可以为double. 1.内存溢出的实例 package test.only

java中的不死兔问题(斐波那契数列)(递归思想)

有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? public class Item { public static void main(String[] args) { // 不死兔问题 System.out.println(rabbit(3)); } public static int rabbit(int m) { if(m <= 0) { System.out.println("输入错误!没有此月份

剑指offer-矩形覆盖-斐波那契数列(递归,递推)

class Solution { public: int rectCover(int number) { if(number==0 || number==1||number==2) return number; return rectCover(number-1)+rectCover(number-2); } }; *******************************************************************************************

斐波那契数列 递归 尾递归 递推 C++实现

==================================声明================================== 本文原创,转载请注明作者和出处,并保证文章的完整性(包括本声明). 本文不定期修改完善,为保证内容正确,建议移步原文处阅读. 本文链接:http://www.cnblogs.com/wlsandwho/p/4205524.html ===============================================================

斐波那契数列递归的时间复杂度

f(n)=f(n-1)+f(n-2) 二阶常系数差分方程,解得: 当n趋于无穷大,后面的加数趋于0,则约等于O(1.618^n),即如O(2^n)级别 其实可以树状展开看下,顶层是f(n),之后每层翻倍,则所有子节点的和约为2^n级别,但不会满二叉,所以比这小点. 原文地址:https://www.cnblogs.com/willaty/p/11396840.html

一起talk C栗子吧(第四回:C语言实例--斐波那契数列)

各位看官们,大家好,从今天开始,我们讲大型章回体科技小说 :C栗子,也就是C语言实例.闲话休提, 言归正转.让我们一起talk C语言实例吧! 看官们,上一回中咱们说的是求阶乘的例子,这一回咱们说的例子是:斐波那契数列. 看官们,斐波那契数列是以数学家斐波那契数列的姓来命名的.斐波那契数列的定义:数列的第0项和第1项 为1,第n项为第n-1项和第n-2项的和.用数学公式表示出来就是:f(n)=f(n-1)+f(n-2),其中(n>1),f(n)=1;(n=0,1). 看官们,我在程序中使用了递归

递归:阶乘、斐波那契数列

阶乘 public static void main(String[] args) { System.out.println(factorial(5));; } //factorial 阶乘 public static long factorial(int n) { if (n == 1) { return 1; } return n*factorial(n-1); } 阶乘画图理解 斐波那契数列递归实现: public static void main(String[] args) { Sys

斐波那契数列的最优算法(O(logN))

相信大家都对斐波那契数列已经相当的熟悉了,最多两分钟就可以写出来以下时间复杂度为O(N)的代码: //递归实现 long long fib(int n) { if (n =1 || n== 2) { return 1; } return (fib(n - 2) + fib(n - 1)); } 或者是这样的时间复杂度为O(N),空间复杂度为O(1): //优化一:时间复杂度为O(N) long long fib(int n) { long long* fibarry = new long lon