首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Python代码找bug(7)

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在哪呢?

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

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

下一篇
举报
领券