第63讲:Python编程案例之猴子吃桃

news2024/11/23 16:47:09

文章目录

    • 1.需求描述以及分析
    • 2.递推方式实该该程序
    • 3.递归方式实现该程序

1.需求描述以及分析

需求描述:

猴子第一天摘了若干个桃子,第一天吃了若干个桃子中的一半,觉得不过瘾,又多吃了一个。

第二天早上又将第一天剩下的桃子吃了一半,并且也觉得不过瘾,又多吃了一个。

第三天早上有讲第二天剩下的桃子吃了一半,并且也觉得不过瘾,又多吃了一个。

以后每天早上都会吃前一天剩下的一半桃子,且会多吃一个。

到第10天的时候发现只剩下一个桃子了,求猴子第一天一共摘了多少桃子?

需求分析:

猴子每天都会吃掉前一天所剩桃子数的一半,可以得到这样一个推理过程:

  • 第一天吃掉了一半的桃子,还剩下一半,又多吃了一个,第二天吃了第一天所剩桃子数的一半,并且也多吃了一个。
  • 那么就得到:第1天的桃子个数是第2天所吃的桃子个数加1后的2倍,第2天的桃子个数是第3天所吃的桃子个数加1后的2倍,依次类推,直到只剩下1个桃子。第n天的桃子数就是第n+1天所吃的桃子个数加1后的2倍。

计算猴子每天吃的桃子个数时,需要从第10天开始计算,因为明确知道第10天只有1个桃子,然后再算第9天的桃子个数,第9天的桃子树等于第10天的桃子树加1乘2的个数,第9天的桃子树就是(1+1)*2=4个,第9天就是4个桃子,按照这个思路一直计算第8天、第7天,一直到第一天为止,将每天的桃子数累加起来,就是第一天摘了多少个桃子。

2.递推方式实该该程序

首先使用递推的方式来实现这个程序,设计思路如下:

  • 已知第1天的桃子个数是第2天所吃的桃子个数加1后的2倍,第2天的桃子个数是第3天所吃的桃子个数加1后的2倍。

  • 我们可以将每天的桃子数放在一个列表mp里,在列表中填充11个None值,只有10天,填充11个元素的目的是,索引为0的元素不会被处理,因此要填充11个元素,已知第10天的桃子数为1,那么就将索引为10的元素,初始化成1:mp[10]=1

  • 可以设n天的桃子数为mp[n],递推表达式就是:mp[n]=(mp[n+1]+1)*2,且mp[10]=1

  • 确定好表达式之后,我们就可以写一个for循环,已知第10天为1个桃子了,那么就从第9天开始循环,已知递推循环到第1天,每循环一次,就根据递推表达式,计算出这天的桃子树,递推表达式会将后一天的桃子数加1并且乘以2,因此不用手动累加每天的桃子个数,到了第一天时,一定是准确的桃子个数。

    例如第一次循环时第9天,根据递推表达式mp[9] = (mp[9+1] + 1) *2 = mp[9] = (mp[10] + 1) = 2 * 2 = 4 ,第9天的桃子数就是4个,以此类推。

def monkey_peach():
    #首先定义一个列表,存放11个元素,表示猴子每天的桃子数量,放11个是因为索引为0的元素不会被处理,10天,一直要处理到索引为10的元素,因此要放11个元素
    mp = [None] * 11
    #已知第10天的桃子数量为1,因此直接给第10天赋值为1,表示1个桃子
    mp[10] = 1
    #第10天不用处理,从第9天开始循环遍历,一直到第1天,需要采用逆推的方式,因此步长为-1
    for n in range(9, 0, -1):
        #带着每次循环的天数,去套逆推表达式,得到本天的桃子数量
        mp[n] = (mp[n + 1] + 1) * 2
    #由于当天的桃子数量都是后一天桃子数+1的2倍,因此无需对列表中的元素进行累加,求第一天摘了多少个桃子,直接返回索引为1的元素即可
    return mp[1]

print('猴子第一天一共摘了{}个桃子'.format(monkey_peach()))

image-20220831170944021

3.递归方式实现该程序

使用递推方式,每次都会用当前的天+1之后得到后一天的桃子树,然后加1乘2得到当天的桃子树,这个递推关系相当于在一个函数的内部又调用了一遍函数,所以我们可以使用递归函数来实现这个例子。

递归的结束条件就是当循环到第10天时,返回1。

代码如下:

def monkey_peach(day):
    if day == 10:
        return 1
    else:
        return (monkey_peach(day + 1) + 1) * 2

print('猴子第一天一共摘了{}个桃子'.format(monkey_peach(1)))

image-20220831170944021

递归的循环过程是:将传递的参数带入到循环体内,开始进行递推,直到满足循环结束条件时,递推结束,然后开始回归,将最后一次递推执行的结果,向前面递推的进行运算,直到第一个递推结果处为止,最后返回对应的结果。

猴子吃桃的递归遍历过程:

1)首先开始递推

递归函数:monkey_peach(day + 1) + 1)

  • 调用函数时传入day的实参为1,即day=1,视作为day1。
  • 开始第一次递推:day+1=1+1=2,即day1+1,视作为day2。
  • 开始第二次递推:day+1=2+1=3,即day2+1,视作为day3。
  • 开始第三次递推:day+1=3+1=4,即day3+1,视作为day4。
  • 开始第四次递推:day+1=4+1=5,即day4+1,视作为day5。
  • 开始第五次递推:day+1=5+1=6,即day5+1,视作为day6。
  • 开始第六次递推:day+1=6+1=7,即day6+1,视作为day7。
  • 开始第七次递推:day+1=7+1=8,即day7+1,视作为day8。
  • 开始第八次递推:day+1=8+1=9,即day8+1,视作为day9。
  • 开始第九次递推:day+1=9+1=10,10满足递归结束条件:if day == 10,此时递推结束,第九次递推拿到return返回值1。

2)然后带着返回值开始回归遍历计算

  • 带着第九次递推的返回值去回归。

  • 回归到第八次递推,即day9,此时day9的结果就是((day9+1)+1)*2,day9+1为day10,day10的值1,然后套入公式中,即day9=(1+1)*2=4

  • 回归到第七次递推,即day8,此时day8的结果就是((day8+1)+1)*2,day8+1为day9,day9的值为4,然后套入公式中,即day8=(4+1)*2=10

  • 回归到第六次递归,即day7,此时day7的结果就是((day7+1)+1)*2,day7+1为day8,day8的值为10,然后套入公式中,即day7=(10+1)*2=22

  • 回归到第五次递推,即day6,此时day6的结果就是((day6+1)+1)*2,day6+1为day7,day7的值22,然后套入公式中,即day6=(22+1)*2=46

  • 回归到第四次递推,即day5,此时day5的结果就是((day5+1)+1)*2,day5+1为day6,day6的值为46,然后套入公式中,即day5=(46+1)*2=94

  • 回归到第三次递归,即day4,此时day4的结果就是((day4+1)+1)*2,day4+1为day5,day5的值为94,然后套入公式中,即day4=(94+1)*2=190

  • 回归到第二次递推,即day3,此时day3的结果就是((day3+1)+1)*2,day3+1为day4,day4的值190,然后套入公式中,即day3=(190+1)*2=382

  • 回归到第一次递推,即day2,此时day2的结果就是((day2+1)+1)*2,day2+1为day3,day3的值为382,然后套入公式中,即day2=(382+1)*2=766

  • 到此递推和回归就结束了,带着返回值766与调用函数传递的day1进行运算,day1的结果就是((day1+1)+1)*2,day1+1位day2,也就是递归函数的运算结果766,套入公式中即day1=(766+1)*2=1534

1534就是函数的返回值。

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

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

相关文章

Spring 项目创建和使用2 (Bean对象的存取)

目录 一、创建 Bean 对象 二、将Bean对象存储到 Spring容器中 三、创建 Spring 上下文(得到一个Spring容器) 1. 通过在启动类中 ApplicationContext 获取一个 Spring容器 2. 通过在启动类种使用 BeanFactory 的方式来得到 Spring 对象 (此…

MAYA粒子目标goalV和goalU详细应用

一下就填充到点 一个一个点填充 nParticleShape1.goalV0.5; nParticleShape1.goalU0.5; 粒子向中心移动 V方向使用渐变 删除U方向表达式 也使用渐变 使用圆角 nParticleShape1.goalUrand(0,1); nParticleShape1.goalUnParticleShape1.goalU0.02; nParticleShape1.goalUnPartic…

Excel-公式VLOOKUP 使用方法-小记

个人愚见 表示 MongoDB列中的任意一条数据 在 MySQL列 精确查找 和MongoDB列 中一模一样的数据,有的话返回MongoDB列数据,没有话返回#N/A 官方解释

redis 三种缓存更新策略

今天聊聊redis 三种缓存更新策略分别是: Cache Aside(旁路缓存)策略; Read/Write Through(读穿 / 写穿)策略; Write Back(写回)策略; 其中 Cache Aside策略…

php通过IP获取用户当前所在城市

php获取当前用户所在城市 php通过ip免申请api获取所在城市的代码包括省市区sql数据 <?php function getName($pinyin,$lv){$servername "localhost";$username "root";$password "root";$dbname "ttx";try {$conn new PDO(…

Blazor前后端框架Known-V1.2.4

V1.2.4 Known是基于C#和Blazor开发的前后端分离快速开发框架&#xff0c;开箱即用&#xff0c;跨平台&#xff0c;一处代码&#xff0c;多处运行。 Gitee&#xff1a; https://gitee.com/known/KnownGithub&#xff1a;https://github.com/known/Known 概述 基于C#和Blazor…

一款开源的Hitomi-Downloader视频下载工具,几乎支持所有主流视频网站

一款开源的Hitomi-Downloader视频下载工具&#xff0c;几乎支持所有主流视频网站 用过IDM的朋友可能知道IDM有个强大的功能就是可以嗅探网站各种视频、音频等资源&#xff0c;然后提供快捷下载&#xff0c;可不巧的是IDM是收费软件。对于不愿意付费购买IDM的朋友&#xff0c;能…

AssetBundle.Unload(true)无法卸载图集

1&#xff09;AssetBundle.Unload(true)无法卸载图集 ​2&#xff09;关于Unity 2D游戏地图预加载的问题 3&#xff09;Addressables能否支持某些资源不打Bundle直接加载源文件 这是第342篇UWA技术知识分享的推送&#xff0c;精选了UWA社区的热门话题&#xff0c;涵盖了UWA问答…

如何在CSDN博客平台上吸引铁粉

&#x1f3c6;荣誉认证&#xff1a;51CTO博客专家博主、TOP红人、明日之星&#xff1b;阿里云开发者社区专家博主、技术博主、星级博主。 &#x1f4bb;微信公众号&#xff1a;微笑的段嘉许 &#x1f4cc;本文由微笑的段嘉许原创&#xff01; &#x1f389;欢迎关注&#x1f5…

照片文件大小怎么修改为200k?图片压缩怎么指定大小?

日常生活和工作中&#xff0c;经常用到图片&#xff0c;但是有时候需要将图片压缩指定大小来符合各种规定&#xff0c;比如图片压缩到200kb&#xff0c;那么有没有简单方便的图片压缩&#xff08; https://www.yasuotu.com/imagesize&#xff09;的方法呢&#xff1f;下面就拿压…

Centos 7 安装 Oracle 11G

Oracle 11G 安装教程 准备环境 p13390677_112040_Linux-x86-64_1of7.zipp13390677_112040_Linux-x86-64_2of7.zipCentos 7- rhel7-英文版的系统–不想换语言的执行(LANGen_US)– 传输 文件到服务器上 创建用户和组 [rootlocalhost ~]# groupadd oracle [rootlocalhost ~]…

用cmd命令刷新dns缓存

DNS flush with “ipconfig /flushdns” To flush the DNS via CMD, use the command ipconfig. To do this, enter the following command and confirm it with enter: ipconfig /flushdns After successful execution, you will receive a message that the DNS resolution…

【Go语言开发】将logrus日志送到elasticsearch构成elk体系

写在前面 这篇文章我们来讲讲怎么把logrus日志送到es。 使用的日志库是 github.com/sirupsen/logrus&#xff0c;由于这个包中的日志对象是可以接入很多个hook的&#xff0c;所以我们可以使用hook来接入 elasticsearch 来操作 。 hook 就是钩子&#xff0c;当设置hook在某个点…

第一章 SegFormer(语义分割篇)——SegFormer: 简单高效的基于Transformer的语义分割设计

0.摘要 我们提出了SegFormer&#xff0c;这是一个简单、高效且强大的语义分割框架&#xff0c;它将Transformer与轻量级多层感知机&#xff08;MLP&#xff09;解码器结合在一起。 SegFormer具有两个吸引人的特点&#xff1a; 1&#xff09;SegFormer包含一个新颖的层次结构的…

【C语言】猜数字游戏

问题描述 猜数字游戏是令游戏机随机产生一个100以内的正整数&#xff0c;用户输入一个数对其进行猜测&#xff0c;需要你编写程序自动对其与随机产生的被猜数进行比较&#xff0c;并提示大了&#xff08;“Too big”&#xff09;&#xff0c;还是小了&#xff08;“Too small”…

springboot项目target下面没有mapper.xml文件

文件结构是这个样子,mapper.xml文件在resources/mappers/fdms目录下面 通常来说, 将mapper打包到target目录下只需要在maven下面配置 <resources><resource><directory>src/main/resources</directory><filtering>true</filtering><inc…

prometheus采集服务的jmx数据,grafana通过dashboard展示jmx数据

prometheus采集服务的jmx数据&#xff0c;grafana通过dashboard展示jmx数据 一、下载prometheus二、解压prometheus三、查看prometheus目录四、查看prometheus版本五、查看prometheus的配置文件六、启动prometheus七、登陆prometheus八、查看prometheus jmx九、下载grafana十、…

嵌入式内核及驱动开发高级

一、起源 仅devfs&#xff0c;导致开发不方便以及一些功能难以支持&#xff1a; 热插拔 不支持一些针对所有设备的统一操作&#xff08;如电源管理&#xff09; 不能自动mknod 用户查看不了设备信息 设备信息硬编码&#xff0c;导致驱动代码通用性差&#xff0c;即没有分离…

AI实现口语练习技术解决方案

最近AI技术取得了技术上的突破&#xff0c;可以非常智能化的实现人机交互。在应用场景上很自然会想到利用AI来实现口语练习&#xff0c;下面和大家分享AI实现口语练习的AI技术方案和开发流程&#xff0c;只列出的整体思路和概略步骤&#xff0c;具体的步骤可能会根据具体的需求…

HttpClient——入门案例(发送http请求)

前言介绍 总结就是使得可以在java程序中发送http请求。 导入依赖 <dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.13</version></dependency> 发送get请求 用…