一起学算法(递推篇)

这篇具有很好参考价值的文章主要介绍了一起学算法(递推篇)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言:递推最通俗的理解就是数列,递推和数列的关系就好比算法和数据结构的关系,数列有点像数据结构中的顺序表,而递推就是一个循环或者迭代的过程的枚举过程

1.斐波那契数列

斐波那契数形成的序列称为斐波那契数列,该数列由0和1开始,后面的每一项数字都是前面两项数字之和,也就是:

F[0]=0   F[1]=1

0  1  1  2  3  5  8  13 21  34  根据规律我们很容易推得下面递推公式:

F[n]=F[n-1]+F[n-2]     其中n>1  

递归函数有两大要点:1.递归的终止条件     2.递归操作(根据上文已推f(n-1)+f(n-2))

    public int fib(int n) {
        //递归条件
        if(n<2){
            return n;
        }
       //递归操作
       return fib(n-1)+fib(n-2);
    }
  • 递归用的用的数据结构其实是栈(先进先出),是自顶向下的算法
  • 因为第一项第二项我们是很容易得到的,所以可以当做递归结束的出口
  • 利用递推公式逐步的计算每一项的值
  • 最后返回结果即可

2.泰波那契数列

泰波那契数列Tn的定义如下:

T(0)=0   T(1)=1    T(2)=1

且在n>2的条件下T(n)=T(n-1)+T(n-2)+T(n-3) 给你一个整数n,返回T(n)的值

如果已经理解了斐波那契数列,那么这个问题也不难,只不过递归条件,递归操作多加一点东西而已,看代码:

    public int tribonacci(int n) {
        if(n<2){
            return n;
        }
        if(n==2){
            return 1;
        }
         return tribonacci(n-1)+tribonacci(n-2)+tribonacci(n-3);
    }
  • 0 <= n <= 37   看这个数据范围,当递归这种情况的时候,时间复杂度是很高的,所以不出意外的超时了,但是这种方法也可以用别的方法去做,比如记忆化数组以及动态规划,这部分在这里先不讲了,后面会详细介绍的

3.斐波那契数列的问题转换

1.爬楼梯问题

一起学算法(递推篇),算法

给定一个n(1<=n<=45)代表总共有n阶台阶,一开始在第n阶台阶, 每次可以爬1或者2个台阶,问总共有多少种不同的方式可以爬到楼顶

假设我们现在已经在第n层,我们是不是可以由第n-1层或者是第n-2层跳过来的呢?所以我们可以推得如下的递推关系式 F[i]=F[i-1]+F[i-2]

于是我们可以发现这个递推公式和斐波那契数列公式极为相像,既然解题思路也是一致,只需要修改递归条件就可以解除本题,但是由于这种的时间复杂度过高

一般是从递推->记忆化搜索->动态规划->状态压缩 进行优化

    //递归
    public int numWays(int n) {
        if(n==0){
            return 1;
        }
        if(n==1){
            return 1;
        }
        if(n==2){
            return 2;
        }
       //递归操作
       return numWays(n-1)+numWays(n-2);
    }

2.二维递推问题(后面细聊,这部分对于新手来说确实有些困难)

leetcode题单:

斐波那契数

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

第N个泰波那契数

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

青蛙跳台阶问题

   private static final int[] meno=new int[101];
    //递归
    public int numWays(int n) {
        if(n==0||n==1){
            meno[n]=1;
            return 1;
        }   
     if(meno[n]==0){
         meno[n]=(numWays(n-1)+numWays(n-2))%1000000007;
     }
     return meno[n];
    }

三步问题

    public int waysToStep(int n) {
      if(n<2){
          return 1;
      }
      int[] dp=new int[n+1];
      dp[0]=1;
      dp[1]=1;
      dp[2]=2;
      for(int i=3;i<dp.length;i++){
          dp[i]=(((dp[i-1]+dp[i-2])%1000000007)+dp[i-3])%1000000007;
      }
      return dp[n];
    }

爬楼梯文章来源地址https://www.toymoban.com/news/detail-619801.html

    private static final int[] meno=new int[101];
    public int climbStairs(int n) {

        if(n==0||n==1){
            meno[n]=1;
            return 1;
        }   
     if(meno[n]==0){
         meno[n]=climbStairs(n-1)+climbStairs(n-2);
     }
     return meno[n];
    }

到了这里,关于一起学算法(递推篇)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java中常用算法及示例-分治、迭代、递归、递推、动态规划、回溯、穷举、贪心

    1、分治算法的基本思想是将一个计算复杂的问题分成规模较小、计算简单的小问题求解, 然后综合各个小问题,得到最终答案。 2、穷举(又称枚举)算法的基本思想是从所有可能的情况中搜索正确的答案。 3、迭代法(Iterative Method) 无法使用公式一次求解,而需要使用重复结构

    2024年02月08日
    浏览(45)
  • 一起学算法(选择排序篇)

           距离上次更新已经很久了,以前都是非常认真的写笔记进行知识分享,但是带来的情况并不是很好,一度认为发博客是没有意义的,但是这几天想了很多,已经失去了当时写博客的初心了,但是我觉得应该做点有意义的事,将知识分享给那些乐于学习想钻研的同学,

    2024年02月14日
    浏览(36)
  • 一起学算法(顺序表篇)

    1.顺序表的定义        用一段地址连续的存储单元依次存储数据的线性表被称为数据表,在Java中顺序表一般是数组或者是ArrayList实现的 先把代码放这里,接下来一一给大家进行讲解: 1.遍历的含义 对顺序表的元素进行一次访问的过程被称为遍历 2.动画演示  黄色代表第一

    2024年02月12日
    浏览(35)
  • 一起学算法(插入排序篇)

    插入排序(inertion Sort)一般也被称为直接插入排序,是一种简单的直观的排序算法 工作原理:将待排列元素划分为(已排序)和(未排序)两部分,每次从(未排序的)元素选择一个插入到(已排序的)元素中的正确位置,这个位置类似于平时打扑克牌摸牌的操作,右手摸

    2024年02月15日
    浏览(37)
  • 一起自学SLAM算法:11.3 路径规划

    连载文章,长期更新,欢迎关注: 写在前面 第1章-ROS入门必备知识 第2章-C++编程范式 第3章-OpenCV图像处理 第4章-机器人传感器 第5章-机器人主机 第6章-机器人底盘 第7章-SLAM中的数学基础

    2024年02月05日
    浏览(31)
  • 【五大机器学习经典算法,一起跟随浙大开启智能未来!】

    在这个知识更新迭代的浪潮中,你是否面临着人工智能的飞速冲击、就业市场的无形挑战以及被淘汰的压力: 职业焦虑,Al是否会取代我的工作? 学习费劲,知识迭代太快,好不容易跟上却已过时? 键盘敲的冒火星,AI 自动化仅需5分钟 消费降级,升职加薪难上加难 内心的

    2024年02月01日
    浏览(29)
  • 【一起学习数据结构与算法】优先级队列(堆)

    如果我们给每个元素都分配一个数字来标记其优先级,不妨设较小的数字具有较高的优先级,这样我们就可以在一个集合中访问优先级最高的元素并对其进行查找和删除操作了。这样,我们就引入了 优先级队列 这种数据结构。 优先级队列(priority queue) 是0个或多个元素的集

    2024年01月19日
    浏览(42)
  • 一起自学SLAM算法:13.2 运行SLAM构建地图

    连载文章,长期更新,欢迎关注: 写在前面 第1章-ROS入门必备知识 第2章-C++编程范式 第3章-OpenCV图像处理 第4章-机器人传感器 第5章-机器人主机 第6章-机器人底盘 第7章-SLAM中的数学基础 第8章-激光SLAM系统 第9章-视觉SLAM系统 第10章-其他SLAM系统

    2024年02月02日
    浏览(41)
  • 【一起学数据结构与算法】Java实现双链表

    双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。 打印双链表非常简单,只需要单独创一个结点

    2024年02月22日
    浏览(43)
  • 一起自学SLAM算法:5.3 ARM主机RK3399

    连载文章,长期更新,欢迎关注: 写在前面 第1章-ROS入门必备知识 第2章-C++编程范式 第3章-OpenCV图像处理 第4章-机器人传感器 第5章-机器人主机         5.1 X86与ARM主机对比         

    2024年02月11日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包