今天我们进入“返回”小镇的后7关,即第159关至第165关。
应某公号粉丝要求,第162关有更仔细介绍。
先复习一下基础知识:
基础知识
“返回”在编程中经常用到。是每个函数必备的一部分,在我们写完一个函数的时候,我们都习惯性地会在函数最后一行写上return。比如:
return;
这样就不返回任何值。当函数是一个判断函数的时候,就可以让函数返回判断的结果,比如
return yes;
或者
return no;
当然,我们也可以直接返回一个判断语句,比如:
return banana.rotten()
来判断香蕉是否坏了,如果香蕉坏了,banana.rotten()=yes,否则banana.rotten()=no。
下面进入关卡~
第159关
return的意思就是返回,既然函数已经返回了某一个值,就不会再执行return之后的操作。
在上图右侧的代码区域内,return no之后就不会再执行return yes。
因为我们需要小猴子goto banana,所以foo()函数返回的应该是yes。
修改后的代码如下:
点击运行看效果!
第160关
在这一关里,我们需要say something来吓跑乌鸦!
在上图右侧的代码框里,我们已有两行代码吓跑乌鸦,但是在吓跑乌鸦之后呢?
当然是让小猴子goto banana啦!
在第3行上加上一行代码就可以啦,如下:
点击运行看效果!
第161关
有的时候,乌鸦耳朵有点背,所以小猴子需要不听地say something,直到乌鸦被吓跑为止。
我们可以用crow.watching()这个函数来判断乌鸦是否在看着小猴子,既然crow.watching()函数是判断语句,那么crow.watching()函数自己就会返回yes或no。
当乌鸦被吓跑之前,crow.watching()函数返回yes,那么not crow.watching()返回的就是no。这个时候,safe()函数返回的是no。小猴子需要一直say something,直到乌鸦被吓跑。
当乌鸦被吓跑之后,crow.watching()函数返回no,那么not crow.watching()返回的就是yes。这个时候,safe()函数返回的是yes。
我们可以把代码改成:
点击运行看效果!
第162关
在上图中,我们看到有两只乌鸦,那么很简单地,我们可以把上一关的代码借鉴过来,就有一个这样的safe函数:
在这些代码后面,我们需要写入判断小猴子是否可以走向香蕉的代码,如下:
点击运行之后,我们先不看效果,先看结果:
只得到了两个星星!
这是因为我们用到了很笨的方法,用了过多的代码。
而系统要求我们用6行或者更少的代码,才能得到3个星星!
其实我们可以压缩safe函数。
在原来的safe函数,我们用了4行来判断两只乌鸦是否在看着小猴子,这是极其浪费的。
事实上,我们可以用一行就够了。
怎么写?
还记得我们之前学到的逻辑语句吗?and? or?not?
因为我们要判断两只乌鸦是否同时都飞走了,所以我们需要用and连接两个判断语句。
即crows[0].watching() and crows[1].watching()。
当crows[0]和crows[1]都飞走了,那么我们有crows[0].watching()=no和crows[1].watching()=no,等价于not crows[0].watching()=yes和not crows[1].watching()=yes。于是我们有:
not crows[0].watching() and not crows[1].watching()的返回值是yes。
(yes and yes=yes,no and no=no,yes and no =no, yes or no = yes)。
下面是我给出的代码:
点击运行看效果!
这时候可以三星通关!
第163关
上图中的场景和前几关类似,只是香蕉编程了3个。这一关里,我们对香蕉可以用for循环。
不过我们还是要在第2,3行里写入判断乌鸦是否都飞走的代码。
修改后的代码如下:
点击运行看效果!
第164关
这一关里,我们看到由三只乌鸦,这其实和前几关没有什么区别。
我们可以用
nor crows[0].watching() and nor crows[1].watching() and nor crows[2].watching()
来判断三只乌鸦是否全都飞走了。
上图右侧的代码区域如下:
修改后的代码如下,事实上,我们并不需要判断三个乌鸦是否全都飞走了 ,在这个代码里,我们只用判断乌鸦0和乌鸦2都飞走就可以了(大概是因为乌鸦按照顺序飞走吧),但是在现实的情形中,我还是强烈建议用
return nor crows[0].watching() and nor crows[1].watching() and nor crows[2].watching()
来代替如下代码框里的第3行。
点击运行看效果!
第165关
可是如果有很多只乌鸦怎么办?比如上图中有5只乌鸦,难道我们要用
nor crows[0].watching() and nor crows[1].watching() and nor crows[2].watching() and nor crows[3].watching() and nor crows[4].watching()
这样的代码吗?
那如果有100只乌鸦怎么办?
答案是,该用for循环的时候,就用for循环,循环是一个好东西。
比如在如下的代码框里,我们就可以用for循环对乌鸦进行遍历,对每一只乌鸦,我们都可以判断其是否在看着小猴子。
如果乌鸦c在看着小猴子,那么c.watching()=yes.
这时候,小猴子是不能走动的,所以如果c.watching()=yes,那么safe函数应该return no。
修改后的代码如下:
点击运行看效果!
好啦,到现在为止,return函数的全部15关都介绍完了。
下一次,我会给大家介绍成功的“钥匙”这一部分,一共14关,我会分2次教程介绍,每次包括7关。
顺祝大家父亲节快乐,过两年我应该也可以过上这个节日了。
(关于我构思的机器学习的介绍会在以后的文章中给出,会从分类和回归这两个部分讲起。希望大家会喜欢。)