记忆化递归算法

作者: Why__so_serious | 来源:发表于2022-12-13 10:57 被阅读0次

递归常用来解决一些可拆分的,并且拆分到一定程度自然得到解的问题,最经典的就是斐波那契数列(1,1,2,3,5......),从第三个数开始,每个数的值都为前面两个数的和,如第五个数字等于第三个数字加上第四个数字的和,第N个等于第N-1个数字加上第N-2数字的和

public static int Fibonacci(int n) {
    if (n == 1) {
        return 1;
    }
    if (n == 2) {
        return 1;
    }
    return Fibonacci(n-1)+Fibonacci(n-2);

代码看起来很简单,实际上效率很低,当我们计算的数据很大的时候,比如第五十位数,会进行非常多次的分解,如果将运行的顺序抽象为一张类似二叉树的图的话,就能清晰的看到这种直接递归的缺点


图片.png

计算数列第五位数字的时候,运行的步骤是这样的,可以看到重复了两次第三位的结果,随着位数的增加,重复的计算也会急剧上升,我们可以通过一个数组或者集合来保存我们计算过的数据,遇到重复的计算的时候直接从集合中获取

public static int Fibonacci(int n) {
    int memo[]=new int[n+1];
    return Fibonacci(n,memo);
}
public static int Fibonacci(int n,int [] memo) {
    if (memo[n]>0){
        return memo[n];
    }
    if (n==1){
        return 1;
    }
    else if (n==2){
        return 1;
    }else {
        memo[n]=Fibonacci(n-1,memo)+Fibonacci(n-2,memo);
    }
    return memo[n];
}

这样的话,我们的计算效率就会提高很多了

相关文章

  • 记忆化递归算法

    递归常用来解决一些可拆分的,并且拆分到一定程度自然得到解的问题,最经典的就是斐波那契数列(1,1,2,3,5......

  • 递归算法的记忆化

    今天来搞一个递归算法。 有一只青蛙,一次能跳一级,也能跳两级,问跳n级台阶的时候,有几种方法? 这是一个很简单的递...

  • 10.正则表达式匹配

    1.字符串为传递参数的递归法2.指针为传递参数的递归法3.记忆化递归法4.动态规划 3.记忆化递归代码

  • 快速幂模板

    递归算法 非递归算法

  • 0-1 knapsack

    递归 注释记忆化搜索 测试用例 背包大小5 耗时 添加记忆化搜索

  • python递归算法、尾递归算法及优化

    文章概述 递归算法和尾递归概述递归算法的优化 递归算法 介绍:递归算法是计算机编程领域非常重要的一种算法,采用分而...

  • C++ 递归算法

    递归算法,尾递归算法求阶乘!

  • Java递归算法详解

    递归算法是一种直接或者间接调用自身函数或者方法的算法。Java递归算法是基于Java语言实现的递归算法。递归算法的...

  • 记忆化递归算法的强化训练

    这次针对之前的记忆化递归算法,我们来一个加强版 还是那只青蛙,这次他可以跳的更多,他可以一次跳一级,也可以一次跳两...

  • python迷宫游戏,迷宫生成,解决与可视化

    代码已上传github 使用prime算法生成迷宫使用递归算法走迷宫使用pygame做可视化展示 prime算法生...

网友评论

    本文标题:记忆化递归算法

    本文链接:https://www.haomeiwen.com/subject/gqdhqdtx.html