【蓝桥杯日记】第二篇——递归问题的处理


目录

前言 

递归

递归解决的问题

递归的三要素

递归的练习(由浅入深)

1.循环改为递归

2.斐波那契

3.汉诺塔问题

总结


前言 

   大家好呀!我是大雄!一个菜鸡!接下来的几个月和大家分享一下自己在备战蓝桥中遇到的一些问题。感谢大家提出好的思路以及好的学习方法。我提前在这里谢谢大家了,也希望大家能够在蓝桥中取得好的名次。我们一起共勉!加油!!!

   本周主要练习的题目是递归,因为每天也就给练习算法的时间大约是一个多小时,所以整体进度比较缓慢,只希望自己能够赎回报名费,当然也要像其他算法大佬学习!欢迎各位算法大佬对大雄提出的意见和建议,我一定会认真听取的。接下来我们进入正题,递归。

   递归,当学习完成基础语法后,进入算法界可能是我们遇到的第一个问题。当我们看着简单的递归代码却想不清楚代码具体逻辑的时候,推荐大家去看一部电影——盗梦空间。最开始我在学习完递归之后一头雾水,当时老师就推荐去看这部电影。看完整部电影之后好像还是似懂非懂。

递归

递归:及“函数的自己调用自己”,这个可能就是我们的第一印象吧。

官方的回答是:递归是指一种或多种简单的基本情况定义的一类对象或方法,并规定其他所有情况都能被还原为其基本情况。

递归解决的问题

     在现实生活中,有很多问题比较复杂,直接解决这个问题比较困难,但是这些问题可以被分解为n个较小规模与原结构相似的子问题,通过解决这些相对简单的子问题,得到子问题的解,然后将子问题的解合并,从而得到原问题的解。(上边的文字多读几遍)

    上边虽然说的简单对子问题的拆分,如何拆分?

递归的三要素

  1. 终止条件:当递归函数符合这个规则是,不在进行自己调用自己。从而避免死递归。
  2. 继续推进:每一次递归,都要将子问题进行划分,朝着终止条件进行,否则无法结束递归。
  3. 设计法则: 也就是根据递归的规律,写出递归代码。

     递归设计的经验:

    1)找重复(子问题划分)

    2)找重复中的变化量——>参数

    3)找参数变化趋势——>递归出口

递归的练习(由浅入深)

1.循环改为递归

eg:计算1-100之内累加和?

  这应该是学完for循环的练习题目,接下来我们先按照for循环的形式,然后更具三要素逐步转化为递归的形式。

 //for循环
int count=0;
        for (int i = 1; i <=100 ; i++) {
            count+=i;
        }
        System.out.println(count);
//递归
static int fun3(int n) {
    if (n == 1)
        return 1;
    return n+fun3(n-1);
}

分析:

  1. 找重复:n+(n-1),求n-1的累加就是原问题的重复(规模更小)——子问题
  2. 找变化:每次都是n+(n-1)
  3. 设置出口:每次都是n-1,会朝着1这个方向下去,直到等于1然后递归结束。

  我是这样理解的:fun3是张三,最近张三落难了,手头只有10万,急需100万。于是靠着自己“法外狂徒”的名号,向小弟借钱。张三小弟自己把自己的钱拿出来然后在想自己的小弟借钱,然后把自己的钱和借自己小弟的钱给张三。直到凑够100万张三就不凑了!

2.斐波那契

   斐波那契数列是一串递增的整数,其中每一项都是前两项的和。这个数列从0和1开始,其前几项为:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, …。以此类推,第n项的值可以表示为F(n)。

  斐波那契数列的性质:

  • F(0) = 0
  • F(1) = 1
  • F(n) = F(n-1) + F(n-2) 对于所有 n > 1

递推的做法:

static void fun4(int n) {
//        求斐波那契的第n项
//       0 1(第一项) 1 2 3 5
    int f1 = 1, f2 = 1, fn = -1;
    if (n == 1) {
        System.out.println(f1);
    } else if (n == 2) {
        System.out.println(f2);
    } else {
        for (int i = 3; i <= n; i++) {
//          后一项=前一项+前第二项
            fn = f1 + f2;
            f1 = f2;
            f2 = fn;
        }
        System.out.println(fn);
    }
}

递归的做法:

//    斐波那契数列
    static  int Fibonacci(int n){
        if(n==1||n==2){
            return 1;
        }
        return Fibonacci(n-1)+Fibonacci(n-2);
    }

分析(递归):

  1. 找重复:求n项需要求n-1项和n-1项,并将n-1项和n-2项加起来,如果实在想不明白可以把n当前3,然后将n-1就是2和n-2就是1,在进行调用自生就是1+1等于2。递归结束。
  2. 找变化:n-1项+n-1项
  3. 设置出口:斐波那契的第一项和第二项都等于1
3.汉诺塔问题

   汉诺塔问题是一个古老而著名的数学问题,源于印度的一个古老传说。这个问题涉及三个柱子,通常标记为A、B和C。这三个柱子上分别堆叠着若干数量的圆盘,圆盘的大小不同,且按照从小到大的顺序从下到上堆叠在A柱子上。
    汉诺塔问题的目标是在遵循一定规则的前提下,将所有的圆盘从一个柱子移动到另一个柱子。具体规则如下:

  1. 每次只能移动一个圆盘。
  2. 在移动过程中,任何时候都不能将一个较大的圆盘放在一个较小的圆盘上面。
  3. 可以利用第三个柱子(B柱子)作为辅助柱子,即可以在B柱子上暂时放置圆盘。
  4. 对于任何一个具体的步骤,实际上都需要进行三次移动:
  • 将上面的n-1个盘子从起始柱子(如A)移到另一个柱子(如B);
  •  将最大的盘子从起始柱子移到目标柱子(如C);
  • 最后,将n-1个盘子从临时柱子(如B)移到目标柱子(如C)

个人分析:

  1. 开始所有的盘子都在A柱子,从上到下(从小到大)及1—n-1看做一个整体,最后一个最大的盘子看做一个整体,现将1—n-1移动到C柱,B柱作为辅助的柱子。
  2. 将A柱最大的盘子移动到B柱
  3. 将C柱的盘子移动到B柱,借助A柱作为辅助的柱子。
static void hanoiTower(int N,String from,String to,String help){
//N为盘子的个数,按照从小到大排序
//    from 原始柱子 to 到达的柱子 help 辅助的柱子
    if(N==1){
//        移动最后一个盘子
        System.out.println("move"+N+"from"+from+"to"+to);
        return;
    }
    //把前n-1个盘子移动到辅助空间
    hanoiTower(N-1,from,help,to);
//    N移动到target
    System.out.println("move"+N+"from"+from+"to"+to);
//    让前n-1个盘子所在的辅助空间移动到源空间
    hanoiTower(N-1,help,to,from);
}

总结

    本篇主要介绍的是递归的基本概念以及基本的题目,有些比较难得题目我现在也没有头绪好像之后还需要学习分治思想,学习完之后应该可以学会把,自我感觉递归这里有些题目还不太透彻,希望大佬们能给出学习的建议和学习困难题目的方法。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue学习计划-Vue3--核心语法(十)Proxy响应式原理

Proxy响应式原理 1.Vue2的响应式 实现原理&#xff1a; 对象类型&#xff1a;通过Object.defineProperty()对属性的读取、修改进行拦截&#xff08;数据劫持&#xff09;数组类型&#xff1a;通过重写更新数组的一系列方法来实现拦截&#xff0c;&#xff08;对数组的变更方法…

【Linux】各目录说明

【常见目录说明】 目录 /bin 存放二进制可执行文件(ls,cat,mkdir等)&#xff0c;常用命令一般都在这里。 /etc 存放系统管理和配置文件 /home 存放所有用户文件的根目录&#xff0c;是用户主目录的基点&#xff0c;比如用户user的主目录就是/home/user&#xff0c;可以…

浅谈智慧路灯安全智能供电方案设计

摘要: 智慧路灯&#xff0c;作为智慧城市、新基建、城市更新的主要组成部分&#xff0c;近些年在各大城市已得到很好的落地和 应用&#xff0c;但其与传统路灯相比集成大量异元异构电子设备&#xff0c;这些设备的供电电压、接口形式、权属单位各不相同&#xff0c; 如何设计一…

houdini rnn

1.3.RNN模型_哔哩哔哩_bilibili 此公式来自于吴恩达P1.3视频 按公式推测rnn内部结构,如有错误&#xff0c;敬请指正

mysql-锁

文章目录 概念隔离级别未提交读&#xff08;READ UNCOMMITTED&#xff09;提交读&#xff08;READ COMMITTED&#xff09;可重复读&#xff08;REPEATABLE READ&#xff09;可串行化&#xff08;SERIALIZABLE&#xff09; 锁分类按性能乐观锁&#xff08;用版本对比来实现&…

python入门,数据容器的通用操作(len,max,min,sorted)

1.len统计容器内元素个数 2.max统计元素最大元素 3.min统计元素最小元素 4.容器的转化功能 list&#xff08;容器&#xff09;将给定容器转化为列表 字符串转列表将字符串内的每一个元素都取了出来作为列表的每一个元素 字典则只会取出它的key&#xff0c;value会消失 str&…

在线SM2密钥生成工具

在线SM2密钥生成工具 - BTool在线工具软件&#xff0c;为开发者提供方便。本工具为你提供便捷的SM2密钥生成功能。SM2是中国国家密码管理局颁布的中国商用公钥密码标准算法(一种非对称加密算法)&#xff0c;SM2采用的是ECC 256位的一种椭圆曲线的加密算法,其密钥长度256bit&…

go中如何进行单元测试案例

一. 基础介绍 1. 创建测试文件 测试文件通常与要测试的代码文件位于同一个包中。测试文件的名称应该以 _test.go 结尾。例如&#xff0c;如果你要测试的文件是 math.go&#xff0c;那么测试文件可以命名为 math_test.go。 2. 编写测试函数 测试函数必须导入 testing 包。每…

HIve项目入门 环境部署遇到的问题及解决方案

环境布置的步骤建议是jdk, hadoop hive这几个分别去下载&#xff0c;参考以下几个安装教程&#xff1a; 【主要参考&#xff1a;傻瓜式教程】Windows下安装Hive MySQL版【附安装Hadoop教程】全网最详细的图文教程 【有一些补充的内容】&#xff1a;Windows下安装Hive 遇到的几个…

2024.1.16每日一题

LeetCode 2719.统计整数数目 2719. 统计整数数目 - 力扣&#xff08;LeetCode&#xff09; 题目描述 给你两个数字字符串 num1 和 num2 &#xff0c;以及两个整数 max_sum 和 min_sum 。如果一个整数 x 满足以下条件&#xff0c;我们称它是一个好整数&#xff1a; num1 &l…

QT 原生布局和QML的区别

一、QML 与 Qt Quick的区别 1.1 从概念上区分 为了更精确地对两者进行说明&#xff0c;先看助手对 QML 的描述&#xff1a; QML is a user interface specification and programming language. QML 是一种用户界面规范和标记语言&#xff0c;允许开发人员和设计师创建高性能、流…

招生官怒批ChatGPT文书质量“缺少灵魂”

ChatGPT无疑是最近两年留学届的热门话题&#xff0c;也成为了不少留学生再也离不开的万能工具&#xff0c;从总结文献、润色论文、给教授写email似乎无所不能。甚至还有不少同学在考虑直接提交ChatGPT生成的文书。 那么ChatGPT生成的文书质量高吗&#xff1f;各大高校对于学生…

【NI国产替代】PXI-6254,32 AI(16位,1 MS/s),48 DIO,PXI多功能I/O模块

32 AI&#xff08;16位&#xff0c;1 MS/s&#xff09;&#xff0c;48 DIO&#xff0c;PXI多功能I/O模块 PXI-6254提供模拟输入、关联数字I/O、两个32位计数器/定时器以及模拟和数字触发。该设备为从实验室自动化、研究、设计验证/测试到制造测试等各种应用提供了低成本的可靠D…

基于ssm的疫苗预约系统论文

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装疫苗预约系统软件来发挥其高效地信息处理的作用&#xff0c…

Vue-API

$parent 和 $children $parent 父传子--在子组件中使用&#xff0c;放在计算属性、生命周期中&#xff1a; $children 子传父--方法中使用&#xff1a; $nextTick: $ref: 操作dom $set、$delete:

Docker-01-安装基础命令

Docker-01-安装&基础命令 文章目录 Docker-01-安装&基础命令一、Docker是什么&#xff1f;二、安装Docker①&#xff1a;卸载旧版②&#xff1a;配置Docker的yum库③&#xff1a;安装Docker④&#xff1a;启动和校验⑤&#xff1a;配置镜像加速01&#xff1a;注册阿里云…

第二证券:旅游股大涨 “预热”春节黄金周

在淄博烧烤热、哈尔滨冰雪热火爆出圈后&#xff0c;希望能接住文旅下一波“泼天富贵”的各地文旅局各出奇招并“卷”出新高度&#xff0c;被各地网友谈论“杀疯了”。 其间&#xff0c;A股游览概念股迎来一波集体上涨&#xff0c;成为不少出资者的重视热点&#xff0c;而行将到…

人机协同中存在一个独特的时空体系

一、在人机协同中存在一个独特的时空体系 在人机这个独特的时空体系中&#xff0c;人和机器之间的时间和空间的交织和共同作用。 在时间维度上&#xff0c;人机协同体系中的人和机器具有不同的时间节奏和速度。人类有限的生命周期和有时候需要休息的需求使得他们的工作时间和生…

Java 使用 EasyExcel 爬取数据

一、爬取数据的基本思路 分析要爬取数据的来源 1. 查找数据来源&#xff1a;浏览器按 F12 或右键单击“检查”打开开发者工具查看数据获取时的请求地址 2. 查看接口信息&#xff1a;复制请求地址直接到浏览器地址栏输入看能不能取到数据 3. 推荐安装插件&#xff1a;FeHelper&a…

Dockerfile: CMD与ENTRYPOINT区别

CMD和ENTRYPOINT的作用 CMD和ENTRYPOINT这两个命令&#xff0c;我接触到的是用在了Dockerfile中用于构建容器。 CMD&#xff1a;The main purpose of a CMD is to provide defaults for an executing container. CMD的主要用途是为正在执行的容器提供默认值。也就是指定这个容…