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

news2025/1/11 9:10:57


目录

前言 

递归

递归解决的问题

递归的三要素

递归的练习(由浅入深)

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.coloradmin.cn/o/1388382.html

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

相关文章

微信小程序(四)页面跳转

注释很详细&#xff0c;直接上代码 新增内容 1.相对路径页面跳转 2. 绝对路径页面跳转 index.wxml <!-- navigator是块级元素&#xff0c;占一整行 --> <!-- 页面跳转url&#xff0c;相对路径 --> <navigator url"../logs/logs"><button type&…

【现代密码学】笔记6--伪随机对象的理论构造《introduction to modern cryphtography》

【现代密码学】笔记6--伪随机对象的理论构造《introduction to modern cryphtography》 写在最前面6 伪随机对象的理论构造 写在最前面 主要在 哈工大密码学课程 张宇老师课件 的基础上学习记录笔记。 内容补充&#xff1a;骆婷老师的PPT 《introduction to modern cryphtogr…

Vue中的全局组件与局部组件

聚沙成塔每天进步一点点 本文内容 ⭐ 专栏简介1. 全局组件的原理2. 局部组件的原理3. 组件注册的影响与考虑因素全局组件的使用场景&#xff1a;局部组件的使用场景&#xff1a; 4. 组合使用全局组件与局部组件 ⭐ 写在最后 ⭐ 专栏简介 Vue学习之旅的奇妙世界 欢迎大家来到 Vu…

Android 捕获native异常

11.使用google官方提供的breakpad 地址&#xff1a;Android 捕获native异常 https://github.com/google/breakpad 2.编译breakpad的so文件 2.1设置需要编译的架构 3.编译完&#xff0c;在build\intermediates\cmake\debug\obj目录下获取对应架构的so包 4.编译一个错误的so包…

MIT 6s081 lab3:page tables

Lab3: page tables 作业地址&#xff1a;Lab: page tables (mit.edu) 本实验的目标&#xff1a;修改页表、简化从用户态拷贝数据到内核态的方法 其实页表就几个操作&#xff1a;创建页表、添加PTE项&#xff0c;查找PTE项&#xff0c;清空PTE项&#xff0c;释放PTE对应的物理…

聚观早报 |一加Ace 3鸣沙金开售;地平线征程6将发布

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 1月16日消息 一加Ace 3鸣沙金开售 地平线征程6将发布 互动短剧《谍影成双》首曝PV 台积电发布四季度财报 保时捷…

JVM实战(21)——jstat实战(2)

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 学习必须往深处挖&…

Proxy的使用方法和13种拦截操作

前言 proxy是ES6新推出的方法,功能很强大。属于元编程,也就是修改js本身的一些东西。可以对数组,对象,函数等引用类型的对象进行一些复杂的操作。 其中,大部分人应该最熟悉的莫过于vue3中使用proxy替换了defineProperty,而且还实现了本身defineProperty不能实现的一些东西。 …

Vue-API

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

UML-实现图(组件图和部署图)

实现图是从系统的层次来描述的&#xff0c;描述硬件的组成和布局&#xff0c;描述软件系统划分和功能实现。 UML-实现图&#xff08;组件图和部署图&#xff09; 一、组件图1.组件图的元素&#xff08;1&#xff09;组件&#xff08;2&#xff09;接口&#xff08;3&#xff09…

linux系统nginx工具的一些应用和基于nginx做虚拟主机

nginx高级应用 虚拟目录监控模块配置文件创建用户名密码客户端访问 限制传输速度&#xff08;服务层&#xff09; nginx虚拟主机基于ip基于域名基于端口 nginx配置文件中的每个语句要以 ; 结尾 虚拟目录 配置文件中的server块中编辑&#xff1a;location /test {alias /usr/…

SparkSQL初体验

SparkSQL初体验 命令式的 API RDD 版本的 WordCount val conf new SparkConf().setAppName("ip_ana").setMaster("local[6]") val sc new SparkContext(conf)sc.textFile("hdfs://master:9000/dataset/wordcount.txt").flatMap(_.split("…

Visual Studio 2019 ctrl+f 呼出查找和替换窗口

有时候 ctrlshiftf 呼出查找和替换窗口不起作用&#xff0c;可能和其它程序的快捷键冲突&#xff0c;解决方案&#xff1a; ------------英文版本------------ 依次点击VS菜单栏中的 Tools - Options - Environment - Keyboard: 1. 在右侧的 Show commands containing: 文本框输…

单列的堆叠柱状图

目的 MSingleColumnStackBarChart类被设计用于创建只有单列的堆叠柱状图&#xff0c;用于血糖数据的统计。以下是封装这个类的目的的详细描述&#xff1a; 抽象复杂性&#xff1a; 通过创建MSingleColumnStackBarChart类&#xff0c;你将复杂的MPAndroidChart库的使用和配置封…

创意交融:集成自定义报表和仪表盘设计器,实现图标替换

前言 在现代数据分析领域&#xff0c;随着对报表和数据分析的需求不断增长&#xff0c;市场上涌现了许多嵌入式报表工具。这些工具能够与企业现有的OA、ERP、MES、CRM等应用系统深度集成&#xff0c;实现对业务数据的自助式分析。然而&#xff0c;在实际应用中&#xff0c;不同…

【量化交易实战记】小明的破晓时刻——2023下半年新能源汽车板块的成功掘金之旅

在2023年的炎炎夏日&#xff0c;小明在不断的观察分析市场的过程中&#xff0c;突然敏锐地察觉到了新能源汽车市场的风云变幻。他日复一日地研读行业报告、追踪政策动向、分析公司财报&#xff0c;以及密切关注全球市场动态。那段时间里&#xff0c;新能源汽车行业仿佛迎来了一…

Vue中父子组件通信

聚沙成塔每天进步一点点 本文内容 ⭐ 专栏简介Vue中父子组件通信1. Props父组件&#xff1a;子组件&#xff1a; 2. 自定义事件子组件&#xff1a;父组件&#xff1a; 3. 使用 v-model子组件&#xff1a;父组件&#xff1a; 4. 使用$refs子组件&#xff1a;父组件&#xff1a; …

必示科技助力中国联通智网创新中心通过智能化运维(AIOps)通用能力成熟度3级评估

2023年12月15日&#xff0c;中国信息通信研究院隆重公布了智能化运维AIOps系列标准最新批次评估结果。 必示科技与中国联通智网创新中心合作的“智能IT故障监控定位分析能力建设项目”通过了中国信息通信研究院开展的《智能化运维能力成熟度系列标准 第1部分&#xff1a;通用能…

通用外设-2.8‘TFT屏的使用

前言 一、验证连接是否正确 二、更改自己想用的图像 1.取模软件 Image2Lcd 2.9 的使用 2.使用 总结 前言 本文在中景园的代码上改写而来&#xff0c;主要记录下使用记录 一、验证连接是否正确 1.按内容说明进行线路连接 2.运行程序&#xff0c;因为内部有图片样本&…

这可能是最全面的Java并发编程八股文了

内容摘自我的学习网站&#xff1a;topjavaer.cn 分享50道Java并发高频面试题。 线程池 线程池&#xff1a;一个管理线程的池子。 为什么平时都是使用线程池创建线程&#xff0c;直接new一个线程不好吗&#xff1f; 嗯&#xff0c;手动创建线程有两个缺点 不受控风险频繁创…