一起学算法(递推篇)

news2024/9/22 23:37:48

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

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];
    }

爬楼梯

    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];
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/814901.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Java|golang】143. 重排链表---快慢指针

给定一个单链表 L 的头节点 head &#xff0c;单链表 L 表示为&#xff1a; L0 → L1 → … → Ln - 1 → Ln 请将其重新排列后变为&#xff1a; L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → … 不能只是单纯的改变节点内部的值&#xff0c;而是需要实际的进行节点交换。 …

python中有哪些异常,怎么处理

目录 python报的错误怎么处理 1. 使用 try-except 语句块 2. 使用 finally 语句块 3. 主动引发异常 python中有哪些异常 不知道是什么异常时怎么操作 总结 python报的错误怎么处理 在Python中&#xff0c;当程序执行时遇到错误&#xff0c;Python会抛出异常。要处理Pyt…

孩子近视有必要用全光谱灯吗?全光谱led灯推荐

当然&#xff0c;有必要!全光谱LED灯的光源分布更加均匀&#xff0c;使空间更加美观舒适&#xff0c;而普通灯的光源分布可能会在一定范围内分布不均匀。全光谱它的使用寿命长达20-30万小时&#xff0c;而普通灯的使用寿命仅为1000-2000小时&#xff0c;因此在长期使用上&#…

list模拟

之前模拟了string,vector&#xff0c;再到现在的list&#xff0c;list的迭代器封装最让我影响深刻。本次模拟的list是双向带头节点的循环链表&#xff0c;该结构虽然看起来比较复杂&#xff0c;但是却非常有利于我们做删除节点的操作&#xff0c;结构图如下。 由于其节点结构特…

收发存和进销存有什么区别?

一、什么是收发存和进销存 1、收发存 收发存是供应链管理中的关键概念&#xff0c;用于描述企业在供应链中的物流和库存管理过程。 收发存代表了企业在采购、生产和销售过程中的物流活动和库存水平。 收&#xff08;Receiving&#xff09; 企业接收供应商送达的物料或产品…

归并排序算法

归并排序 算法说明与实现代码&#xff1a; 归并排序&#xff08;Merge Sort&#xff09;: 归并排序是一种分治算法&#xff0c;它将列表分成两个子列表&#xff0c;分别进行排序&#xff0c;然后将排序好的子列表合并成一个有序列表。 package mainimport "fmt"fu…

手机商城免费搭建之java商城 开源java电子商务Spring Cloud+Spring Boot+mybatis+MQ+VR全景+b2b2c

1. 涉及平台 平台管理、商家端&#xff08;PC端、手机端&#xff09;、买家平台&#xff08;H5/公众号、小程序、APP端&#xff08;IOS/Android&#xff09;、微服务平台&#xff08;业务服务&#xff09; 2. 核心架构 Spring Cloud、Spring Boot、Mybatis、Redis 3. 前端框…

微信小程序代码优化3个小技巧

抽取重复样式 样式复用 我们会发现很多时候在开发的过程中会存在多个页面中都用到了同样的样式&#xff0c;那么其实之前有提到过&#xff0c;公用样式可以放在app.wxss里面这样就可以直接复用。 如&#xff1a;flex布局的纵向排列&#xff0c;定义在app.wxss里面 .flex-co…

win10安装cygwin

参考 Cygwin简介及其下载安装卸载_cygwin是什么软件_徐晓康的博客的博客-CSDN博客https://blog.csdn.net/weixin_42837669/article/details/114381405这个文章写的非常好&#xff0c;不过现在如果想安装多个包的话&#xff0c;采用gui的方式可以不行了&#xff0c;我采用的方式…

JavaScript 简单实现观察者模式和发布-订阅模式

JavaScript 简单实现观察者模式和发布-订阅模式 1. 观察者模式1.1 什么是观察者模式1.2 代码实现 2. 发布-订阅模式2.1 什么是发布-订阅模式2.2 代码实现2.2.1 基础版2.2.2 取消订阅2.2.3 订阅一次 1. 观察者模式 1.1 什么是观察者模式 概念&#xff1a;观察者模式定义对象间…

【Windows11】家庭版开启组策略指南

目录 背景新建一个cmd文件运行运行结果 背景 Win11找不到gpedit.msc怎么办&#xff1f;有用户通过命令窗口想要去打开本地组策略的时候&#xff0c;系统突然弹出了一个错误提示&#xff0c;显示系统缺少了gpedit.msc导致无法开启本地组策略编辑器了。那么这个情况要怎么去进行…

【Web开发指南】如何用MyEclipse进行JavaScript开发?

由于MyEclipse中有高级语法高亮显示、智能内容辅助和准确验证等特性&#xff0c;进行JavaScript编码不再是一项繁琐的任务。 MyEclipse v2023.1.2离线版下载 JavaScript项目 在MyEclipse 2021及以后的版本中&#xff0c;大多数JavaScript支持都是开箱即用的JavaScript源代码…

【Minio怎么用】Minio上传图片并Vue回显

流程&#xff1a; 目录 1.文件服务器Minio的安装 1.1 下载Minio安装后&#xff0c;新建1个data文件夹。并在该安装目录cmd 敲命令。注意不要进错目录。依次输入 1.2 登录Minio网页端 1.3 先建1个桶&#xff08;buckets&#xff09;&#xff0c;点击create a bucket 2. Spr…

前端小练-仿掘金导航栏

文章目录 前言项目结构导航实现创作中心移动小球消息提示 完整代码 前言 闲的&#xff0c;你信嘛&#xff0c;还得开发一个基本的门户社区网站&#xff0c;来给到Hlang,不然我怕说工作量不够。那么这个的话&#xff0c;其实也很好办&#xff0c;主要是这个门户网站的UI写起来麻…

操作系统_进程与线程(三)

目录 3. 同步与互斥 3.1 同步与互斥的基本概念 3.1.1 临界资源 3.1.2 同步 3.1.3 互斥 3.2 实现临界区互斥的基本方法 3.2.1 软件实现方法 3.2.1.1 算法一&#xff1a;单标志法 3.2.1.2 算法二&#xff1a;双标志法先检查 3.2.1.3 算法三&#xff1a;双标志法后检查 …

HarmonyOS/OpenHarmony元服务开发-卡片使用自定义绘制能力

ArkTS卡片开放了自定义绘制的能力&#xff0c;在卡片上可以通过Canvas组件创建一块画布&#xff0c;然后通过CanvasRenderingContext2D对象在画布上进行自定义图形的绘制&#xff0c;如下示例代码实现了在画布的中心绘制了一个笑脸。 Entry Component struct Card { private c…

如何把几个视频合并在一起?视频合并方法分享

当我们需要制作一个比较长的视频时&#xff0c;将多个视频进行合并可以使得整个过程更加高效。此外&#xff0c;合并视频还可以避免出现“剪辑断层”的情况&#xff0c;使得视频内容更加连贯&#xff0c;更加容易被观众理解和接受。再有&#xff0c;合并视频还可以减少视频文件…

第三方电容笔支持随手写吗?性价比高的触控笔推荐

在日常生活中&#xff0c;电容笔的用途非常广泛&#xff0c;无论是配上笔记本&#xff0c;还是配上ipad&#xff0c;又或者是配上手机&#xff0c;都是非常好用的办公利器。首先要明确自己的需要&#xff0c;然后才能选择适合自己的产品。苹果Pencil因为具有特殊的重力压感&…

数据结构07:查找[C++][顺序、分块、折半查找]

图源&#xff1a;文心一言 考研笔记整理~&#x1f95d;&#x1f95d; 在数据结构和算法中&#xff0c;查找是一种常见的操作&#xff0c;它的目的是在一个数据集合中找到一个满足条件的元素。本文将介绍三种常用的查找方法&#xff0c;分别是顺序查找、折半查找和分块查找~&a…

Unity实现在3D模型标记

Canvas 模式是UI与3D混合模式&#xff08;Render modelScreen space-Camera) 实现在3D模型标记&#xff0c;旋转跟随是UI不在3D物体下 代码&#xff1a; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public clas…