病毒繁殖-第12届蓝桥杯选拔赛Python真题精选

[导读]:超平老师的Scratch蓝桥杯真题解读系列在推出之后,受到了广大老师和家长的好评,非常感谢各位的认可和厚爱。作为回馈,超平老师计划推出《Python蓝桥杯真题解析100讲》,这是解读系列的第52讲。

病毒繁殖,本题是2021年3月27日举办的第12届蓝桥杯青少组Python编程选拔赛真题,题目要求编程求解在第N分钟时,病毒粒子的总数量。

先来看看题目的要求吧。

一.题目说明

提示信息:

某种病毒具有很强的繁殖能力,从病毒粒子出生后的第5分钟开始,每分钟可以复制出一个新的病毒粒子。新出生的病毒粒子从第5分钟开始,也可以每分钟复制一个新的病毒粒子。

举例来说,第1分钟时有一个病毒粒子,此病毒粒子从第5分钟开始复制新的病毒粒子,因此第5分钟时的病毒数量为2个;第6分钟时又复制出新的病毒粒子,因此第6分钟的病毒数量为3个;以此类推,第7分钟时病毒粒子数为4;第8分钟时病毒粒子数为5;第9分钟时,第5分钟复制出的病毒粒子开始复制新的病毒粒子,因此第9分钟时的病毒总数为7;第10分钟时,第6分钟复制出的病毒粒子开始复制新的病毒粒子,因此第10分钟时的病毒粒子总数为10。

编程实现:

计算病毒粒子总数,已知第一分钟时出生了一个病毒粒子,假设所有病毒粒子不会自动死亡,请计算第N分钟时的病毒粒子总数。

例如:前10分钟病毒粒子的总数分别为1,1,1,1,2,3,4,5,7,10。

输入描述:

输入正整数 N(0 < N ≤ 60),表示时间

输出描述:

输出第N分钟时,病毒粒子的总数

样例输入:

6

样例输出:

3

二.思路分析

这是一道算法题,考查的算法有递归和递推,涉及的知识点包括循环、条件、列表和函数等。

看到这个题目所描述的场景,你会想到什么呢?

对了,就是斐波那契数列,也叫兔子数列。13世纪意大利数学家斐波那契的《算盘书》中记载了典型的兔子产仔问题。

图片

其大意如下:

如果一对两个月大的兔子以后每一个月都可以生一对小兔子,而一对新生的兔子出生两个月后才可以生小兔子。也就是说,1月份出生,3月份才可产仔。那么假定一年内没有产生兔子死亡事件,那么1年后共有多少对兔子呢?

斐波那契数列是一个非常经典的算法编程题目,有多种实现方法,比如递归和递推等。

不管是使用哪种算法,其关键在于要确定递推公式,比如斐波那契数列的递推公式是这样的:

图片

那本题描述的病毒繁殖,递推公式又是怎样呢?

对于这类问题,我们用f(n)来表示问题的解,通常有如下两种推导方式:

1). 正向推导,利用已知数列找规律;

2). 逆向推导,分析f(n)和f(n-1)之间的关系;

我们先用正向推导方法,题目给出了一个例子,前10分钟病毒粒子的总数分别为:

1,1,1,1,2,3,4,5,7,10

由于新出生的病毒粒子从第5分钟开始复制,说明前面4分钟的病毒例子都只有1个,即:

f(1) = f(2) = f(3) = f(4) = 1

第5分钟,开始复制一个例子,于是就得到了两个病毒粒子:

f(5) = f(4) + f(1) = 1 + 1 = 2

第6分钟呢,它是在第5分钟的基础上,又增加了一个,增加的一个是第1个病毒粒子复制出来的:

f(6) = f(5) + f(2) = 2 + 1 = 3

以此类推,可以分别计算出第7、8、9分钟的病毒数量:

f(7) = f(6) + f(3) = 3 + 1 = 4f(8) = f(7) + f(4) = 4 + 1 = 5

到第9分钟时,第5分钟复制出来的第2个病毒粒子也开始复制了,也就是说有两个病毒粒子在复制,要增加2个,其病毒数量计算如下:

f(9) = f(8) + f(5) = 5 + 2 = 7

第10分钟时,病毒数量计算如下:

f(10) = f(9) + f(6) = 7 + 3 = 10

因此,我们可以得到如下递推公式:

图片

接下来,我们使用逆序推导的方式,此时我们只需要考虑f(n)和f(n-1)之间的关系。

为了方便描述,我们引入两个概念,存量和增量。

图片

所谓存量,是指原来就有的,比如要计算第n分钟的病毒数量f(n),存量就是第n-1分钟的病毒数量f(n - 1)。

所谓增量,是指新增的部分,对于本题而言,就是新复制出来的病毒,那么新复制出来多少呢?

此时,我们只需要明白一点,新出生的病毒粒子从第5分钟才开始复制,可以理解为病毒有4分钟的生长期。

也就是说,在第n分钟时,只有第n - 4分钟的那些病毒粒子才可以复制病毒粒子,所以增量就是f(n - 4)。

两者相加,就是第n分钟的病毒粒子数,如下:

f(n) = f(n - 1) + f(n - 4)

同时,我们还要考虑边界情况,要确保n - 1和 n - 4都大于0,所以n < 5时,需要单独处理。可以理解为前4分钟,病毒粒子还不具备繁殖能力,不能使用这个推导公式来推导。

有了推导公式,问题就变简单了,接下来,我们就进入具体的编程实现环节。

三.编程实现

根据上面的思路分析,我们使用两种方法来编写程序:

  • 递归算法

  • 递推算法

1. 递归算法

根据前面的思路分析,先定义递归函数,然后调用即可,代码如下:

图片

代码比较简单,说明两点:

1). 为了完整性,这里增加了 <= 0的判断,实际上本题中的N是大于0的,所以不写也是可以的;

2). return不仅可以返回结果,还可以直接结束程序,所以只需要使用if语句就行,代码更简洁。

但是,考虑到N的范围是0~60,随着N的增加,时间复杂度急剧增加,所以会存在超时情况。

可以考虑使用带备忘录的递归算法,代码改进如下:

图片

说明如下:

1). 需要借助一个列表,用来保存f(n)的值,其长度为n+1,默认值都是0;

2). 在定义函数的时候,尽量不要依赖外部变量,所以这里将memo列表作为参数进行传递。

2. 递推算法

递归问题,通常都可以改用递推算法来实现。为了方便,我们可以定义一个列表来保存每一分钟的病毒数量。

对应的代码如下:

图片

代码不多,强调2点:

1). 为了方便,这里借用了列表arr,下标i对应的就是第i分钟,所以第一项表示第0分钟,设置为0;

2). 需要分情况讨论,当n < 5时,只需将第1~n项都设置为1,当n >= 5时,先将第1~4项设置为1,然后再利用递推公式计算第5~n项。

当输入n = 10的时候,arr数组如下:

图片

因此,我们只需要输出arr[10]即可。

至此,整个程序就全部完成了,你也可以输入不同的数字来测试效果。

四.总结与思考

本题代码在12行左右,涉及到的知识点包括:

  • 循环语句,主要for...in循环;

  • 条件语句,包括单分支和双分支;

  • 列表的使用;

  • 函数的定义及使用;

  • 递归算法;

  • 递归算法;

本题作为stema测评的最后一题,难度不小。这里的关键点在于如何找到推导公式,并选择相应的算法来实现。

在探寻推导公式的时候,我们使用了两种策略,一是正向推导,二是逆向推导。

实际上,正向推导就是归纳法,其核心思想是从特殊到一般的推理过程,通过对众多的事物特例进行观察和综合,以发现一般规律的推理方法。

而逆序推导就是演绎法,它是一种从普遍性的前提出发,通过逻辑推理得出个别或特殊结论的方法。它基于已知的一般原则或假设,推导出具体的结论,确保如果前提为真,则结论也必然为真。

这是两种非常重要的思维方式,也是我们认识、理解和探索这个世界的基本方法。

二者各有其特点和适用范围,归纳法有助于我们发现新知识和规律,而演绎法则确保从已知前提中得出必然结论。在实际应用中,两种方法常常相互补充,共同推动人类知识的积累和发展。

学习编程不仅仅是学习编程知识,更重要的是培养孩子的思维,包括逻辑思维、数学思维和计算思维。

归纳法和演绎法是逻辑思维的两种具体体现,这两种思维的培养和提升,对于提高我们的逻辑思考能力和问题解决能力至关重要。在平时的学习过程中,要有意识地加强这些思维的训练和提升。

超平老师给你留一道思考题,在上面的递推算法中,我们借助了一个列表用于保存第n分钟的病毒数量,如果不使用数组,是否可以,又该如何实现呢?

你还有什么好的想法和创意吗,也非常欢迎和超平老师分享探讨。

如果你觉得文章对你有帮助,别忘了点赞和转发,予人玫瑰,手有余香😄

需要源码的,可以移步至“超平的编程课”gzh。

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

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

相关文章

数据结构与算法——23.哈希冲突及其解决方法

这篇文章我们主要讲一下哈希冲突及其解决方法。 目录 1.哈希冲突的介绍 2.解决哈希冲突的方法 2.1 开放地址法 2.1.1 线性探测法 2.1.2 平方探测法&#xff08;二次探测法&#xff09; 2.2再哈希法 2.3链地址法 2.4建立公共溢出区 3.总结 1.哈希冲突的介绍 首先&…

vue快速入门(二十五)本地存储与初始化使用

注释很详细&#xff0c;直接上代码 上一篇 新增内容 本地获取数据数据存储到本地 源码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial…

【浪漫 罗盘时钟 Js、css实现(附源代码) 美化版本】,前端面试必问的HashMap

先自我介绍一下&#xff0c;小编浙江大学毕业&#xff0c;去过华为、字节跳动等大厂&#xff0c;目前阿里P7 深知大多数程序员&#xff0c;想要提升技能&#xff0c;往往是自己摸索成长&#xff0c;但自己不成体系的自学效果低效又漫长&#xff0c;而且极易碰到天花板技术停滞…

WebKit简介及工作流程

文章目录 一、WebKit简介二、WebKit结构三、Webkit工作流程四、WebKit常见问题五、WebKit优点六、相关链接 一、WebKit简介 WebKit是一个开源的浏览器引擎&#xff0c;它的起源可以追溯到2001年&#xff0c;当时苹果公司推出了其首款基于Unix的操作系统Mac OS X。在2002年&…

最短网络kruskal算法

题目描述 农民约翰被选为他们镇的镇长&#xff01;他其中一个竞选承诺就是在镇上建立起互联网&#xff0c;并连接到所有的农场。当然&#xff0c;他需要你的帮助。约翰已经给他的农场安排了一条高速的网络线路&#xff0c;他想把这条线路共享给其他农场。为了用最小的消费&…

【Java开发指南 | 第七篇】静态变量生命周期、初始化时机及静态变量相关性质

读者可订阅专栏&#xff1a;Java开发指南 |【CSDN秋说】 文章目录 生命周期初始化时机常量和静态变量的区别静态变量相关性质静态变量的访问修饰符静态变量的线程安全性静态变量的命名规范 生命周期 生命周期&#xff08;Lifecycle&#xff09;是指一个对象从创建到销毁的整个…

光电传感器的工作原理简介

光电传感器是一种利用光电效应将光信号转换为电信号的传感器。 工作原理 光照射&#xff1a;光电传感器通过光源&#xff08;如LED或激光&#xff09;照射在其表面。 光电转换&#xff1a;光线与传感器材料发生光电反应&#xff0c;产生电信号。这种转换过程涉及到光子与电子的…

Albumentations库:为自定义数据进行数据增强

点击下方卡片&#xff0c;关注“小白玩转Python”公众号 为什么在深度学习中使用增强&#xff1f; 深度学习和计算机视觉中的增强已经成为至关重要的几个原因。首先&#xff0c;它丰富了训练数据集&#xff0c;使模型能够从更多样化的示例中学习&#xff0c;这在标记数据有限时…

C++修炼之路之list--C++中的双向循环链表

目录 前言 一&#xff1a;正式之前先回顾数据结构中的双向循环链表 二&#xff1a;list的简介 三&#xff1a;STL中list常用接口函数的介绍及使用 1.构造函数接口 2.list迭代器 范围for 3.数据的修改接口函数 4.list容量操作函数 5.list的迭代器失效 6.演示代码和测…

【深度剖析】曾经让人无法理解的事件循环,前端学习路线

先自我介绍一下&#xff0c;小编浙江大学毕业&#xff0c;去过华为、字节跳动等大厂&#xff0c;目前阿里P7 深知大多数程序员&#xff0c;想要提升技能&#xff0c;往往是自己摸索成长&#xff0c;但自己不成体系的自学效果低效又漫长&#xff0c;而且极易碰到天花板技术停滞…

Mybatispuls-自动填充

一&#xff0c; 创建时间 . 修改时间! 这些个操作都是自动化完成的,我们不希望手动更新! 阿里巴巴开发手册:所有的数据库表:gmt_create .gmt_modified几乎所有的表都要配置上!而且需要自动化! 二&#xff0c;如何实现 1&#xff0c;编写实体类&#xff08;字段属性上添加注解…

ubuntu 23.10.1 mysql 安装

注&#xff1a;请进入root用户模式下操作&#xff0c;若没有&#xff0c;输入命令前加上sudo 1、更新软件包列表 apt update2、安装最新版的Mysql服务器 apt install mysql-server -y如果不加-y 会在安装过程中&#xff0c;系统将提示你设置MySQL的root密码。确保密码足够强…

基于直方图的图像阈值计算和分割算法FPGA实现,包含tb测试文件和MATLAB辅助验证

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 VIVADO2019.2 matlab2022a 3.部分核心程序 timescale 1ns / 1ps // // Company: // Engineer: // // Design Name: // …

【御控物联】Java JSON结构转换(1):对象To对象——键值互换

文章目录 一、JSON是什么&#xff1f;二、JSON结构转换是什么&#xff1f;三、核心构件之转换映射四、案例之《JSON对象 To JSON对象》五、代码实现六、在线转换工具七、技术资料 一、JSON是什么&#xff1f; Json&#xff08;JavaScript Object Notation&#xff09;产生于20…

Leetcode876_链表的中间结点

1.leetcode原题链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 2.题目描述 给你单链表的头结点 head &#xff0c;请你找出并返回链表的中间结点。 如果有两个中间结点&#xff0c;则返回第二个中间结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5…

类与对象(中)

目录 赋值运算符重载 运算符重载 赋值运算符重载 前置和后置重载 日期类的实现&#xff08;前置后置也在里面&#xff09; const 成员 ​编辑 取地址及const取地址操作符重载 赋值运算符重载 运算符重载 C为了增强代码的可读性引入了运算符重载&#xff0c;运算符重载…

【python】python天气气候数据抓取分析可视化(源码+数据+可视化+报告)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

Redis入门到通关之ZSet命令

文章目录 ⛄概述⛄常见命令有⛄RedisTemplate API❄️❄️ 向集合中插入元素&#xff0c;并设置分数❄️❄️向集合中插入多个元素,并设置分数❄️❄️按照排名先后(从小到大)打印指定区间内的元素, -1为打印全部❄️❄️获得指定元素的分数❄️❄️返回集合内的成员个数❄️❄…

汇编基础-----通过x64dbg了解什么是堆栈

汇编基础-----通过x64dbg了解什么是堆栈 什么是堆栈 在汇编语言中&#xff0c;堆栈&#xff08;stack&#xff09;是一种用于存储临时数据和执行函数调用的内存结构。堆栈是一种后进先出&#xff08;Last-In-First-Out, LIFO&#xff09;的数据结构&#xff0c;通常用于保存函…

【Docker系列】容器访问宿主机的Mysql

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…