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

Python代码找bug(8)

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

Python代码找bug(8)

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

代码如下:

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

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

(1)if语句是一个条件判断语句,它后面紧跟的当然应该是一个比较算式,而不是一个赋值语句,所以if j=0应改为:if j == 0。

(2)第二个还是显而易见的print()方法的使用问题,Python3版本必须带括号()。

(3)第三个bug,我们得好好聊一下:

不熟悉递归算法的同学,我们需要弄明白,函数究竟应该返回什么?肯定不是随便一个变量就可以的。本例中,看起来j变量是函数的形参,调用函数,需要提供一个实参给形参j赋值。所以,顺其自然,return j好像正是函数所需要的。朋友,我得好心的提醒你,这是烟幕弹!

Excuse me!那应该是什么?

首先,另一个基本常识是为形参j赋值的实参不一定非要是一个名称为j的变量。所以,是否应该return j就要看此处的递归算法究竟该返回什么。

我们说,要实现递归的算法,返回值必须具备两个前提:其一,它是一个算法(算式)的结果,且这个算式包含了对该函数的再次调用。其二,这个结果是动态的,当递归的迭代运算完成时,它会成为一个特定的值,触发判断条件,而不再重复调用该函数。

OK,这样就很明显了,return后面的不应该是j而应该是c,大多数时候c是阶乘运算的一个算式,其中又包含了对该函数的再次调用,直到j==0时,通过条件分支语句判断成立,得到c=1,此时,执行return c,替代fact(0),这样一个5*4*3*2*1的阶乘运算式就完整的计算出来了,它的结果还是赋值给c,并作为函数的最终返回值返回。

下图演示了递归算法的递推逻辑,可参考:

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

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

(1)学习递归算法。

(2)巩固if条件判断语句。

(3)再次提醒Python3的print()的用法。

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

本期代码设计需求:

有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?

要求使用递归算法计算。

OK,这是一个递归算法的复习案例,非常有利于我们巩固递归算法的学习。

代码如下:

当然,上面的代码还是有bug的。请找出来,发到留言里,明天对答案。

正确答案明天揭晓。

提醒:惯例所有代码都是基于Pythpn3 的哦。

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档