前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python代码找bug(7)

Python代码找bug(7)

作者头像
高一峰
发布2020-09-22 10:08:40
7210
发布2020-09-22 10:08:40
举报
文章被收录于专栏:高渡号外

Python代码找bug(7)

上期的代码设计需求

猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个;第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。

代码如下:

请大家仔细阅读代码,找出其中的bug!

正确答案:共有3个bug。(对答案时间,看看答对了几个?)

(1)请注意range()方法的第三个参数是-1,说明它是一个倒序(或者递减)的for循环。循环的次数由前面2个参数来决定,因为第二个参数是0,所以,第一个参数的大小就决定了循环的次数。那么,到底应该循环多少次呢?因为我们需要计算的结果是依据猴子第10天早上看到的桃的数量,而不是第10天吃完后剩下的数量,所以,按照题目约定的规则,猴子实际上只吃了9天,而不是10天。所以,算法的循环次数应该是9而不是10。

(2)第二个显而易见的问题还是print()方法的使用问题,再次强调这里是Python3版本,所以,必须带括号()。

(3)第三个bug,看起来是“笔误”。就是for循环的代码块的第2行,x1 = x2,谁读懂了这句话?语法的角度,它是一条赋值语句,将x2的值赋值给x1,上面一行代码不是刚刚计算了x1了吗?它计算得到的不就是循环一次后,前一天桃子的数量吗?为什么又要将x2赋值给x1呢?它带来的后果是什么?... 哈哈!这样一来,它牛逼地将x1锁定等于1了,那么,无论你如何循环和计算,最终x1==1。看来,它肯定是犯错了。那我们来推敲一下,经过第1轮循环,我们通过最后一天的桃子数x2=1,将倒数第2天的桃子数x1计算出来了。那么,如果接下来再次循环,我们还是会用后一天的桃子数把前一天的桃子数计算出来了,这时有没有想到,这时的“后一天”的桃子数还是最初的那个x2吗?肯定不是啦,那它是多少?显然就是刚刚计算出来的x1的数量啊,因为通过倒序循环,相对位置往前移动了一天,OK,是不是突然想到什么了?对的,紧接在x1=(x2+1)*2的后面,应该是x2=x1,将x1新得到的值,同时赋值给x2。哈哈,原来如此,那个x1=x2原来是写反了?!惭愧、惭愧!笔误、笔误!怎么会有这样的笔误呢?不知道反过来完全不是一回事吗?真以为是代数呢?难不成是因为女朋友闹分手了?所以,论程序员有一个稳定的女朋友的重要性 ...哎,都不容易!

说实话,程序员写代码有时候不怕逻辑错误,因为二次推导能发现,也不怕语法错误,因为编辑器会帮我们找到它。怕就怕这种奇葩的“笔误”,让自己看了整个人都懵了,不知道为什么,还不敢随便改,得清楚明白地对整个代码块再研究一遍,过一遍,心里踏实了,才敢动这个“爹”,不对,不是“爹”,爹是用来被坑的,应该是才敢动这个“坑爹的”!

好了,也算咱们又积累了一点经验,今后,哥们都要小心点,什么bug都可以有,但最好还是不要有这种“坑爹的”的bug。

所以,正确的代码应该是这样的:

点评:昨天的这个找bug问题,主要目的:

(1)再一次巩固对range()参数的认知,学会使用倒序循环。

(2)巩固print()方法的使用。

(3)巩固赋值语句的用法,防止代码的随意性。

对以上代码阅读还有困难的同学,请翻阅和学习高渡号外前面发送的《Python入门》,或者高渡网站的《Python轻松入门》视频课程。

本期代码设计需求:利用递归算法求5!

需求分析:

首先这是一个极好的问题。因为,递归算法在编程中即是常用算法,也是非常非常重要的一种算法,小到寻找最短路径,大到机器学习,都会用到递归算法。所以,学会它,真的很重要!

当然,递归算法并不复杂,它只是一种非常简单的算法而已。很多人多少有点惧怕它的原因,不是因为它有多复杂,而是因为它有点抽象。跟多维空间或者嵌套循环一样,稍微有点烧脑。

那么,今天我们用计算一个数字的阶乘来应用递归算法,这是一个非常好的案例,建议大家牢记他,一旦忘记了,就可以拿出来稍微看一眼,你就会马上想起来是怎么回事了。

好了,那到底什么是递归算法呢?

简单的理解,递归算法就是:首先我们要创建一个函数,而这个函数会包含一个计算规则,可以简单理解为一个算式。重要的是,这个算式的一部分仍然是调用这个函数本身。这样做的目的,就是要反复的使用那个计算规则(算式)。说到这里,聪明的你,一定会产生疑问,如果自己反复调用自己的话,岂不成了死循环了吗?没错!所以,仅仅有这个算式是不够的,递归算法一定还需要有一个出口。这个出口是由函数的返回值来决定的。当函数的返回值变为一个特定值时,那个算式将不再继续调用该函数,而是给出最后的计算结果。

代码如下:

当然,上面的代码是有bug的。那么,bug在哪呢?

找出来,发到留言里,明天对答案。

提醒,要特别注意格式语法的细节问题。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-07-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 高渡号外 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
腾讯云 TI 平台
腾讯云 TI 平台(TencentCloud TI Platform)是基于腾讯先进 AI 能力和多年技术经验,面向开发者、政企提供的全栈式人工智能开发服务平台,致力于打通包含从数据获取、数据处理、算法构建、模型训练、模型评估、模型部署、到 AI 应用开发的产业 + AI 落地全流程链路,帮助用户快速创建和部署 AI 应用,管理全周期 AI 解决方案,从而助力政企单位加速数字化转型并促进 AI 行业生态共建。腾讯云 TI 平台系列产品支持公有云访问、私有化部署以及专属云部署。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档