上篇介绍算法编写时,有些东西不仅繁琐而且还有重复。我们知道编程语言设计的初衷就 是为了便捷高效,那么一定有方法能避免重复指令的书写。
可喜的是,“循环”就能解决这一问题。循环就是能够使重复指令的编写变得更为高效的结构。你之前一定遇见过循环。地球绕着太阳转就 是每年你所参与的最大的循环,每365天重复一次。而比这小一点的循环呢?地球每24小时自转一周。循环无所不在,只要事物重复,就有循环存在。
我们来用“循环”处理一些基础的指令,使其变得简单一些。假设你站在距离我5步远的地方,我想让你走过来,我可能会说:
“向我走1步”
“向我走1步”
“向我走1步”
“向我走1步”
“向我走1步”
结果,我会因为发布了这么多条指令而筋疲力尽,而你一下子听到5次相同的要求,可能也会特别烦。
你可能已经猜到,较好的解决方案就是我告诉你:“向我走5步。”
这就用到了循环。循环就是执行重复指令,直至过程结束的一种结构。循环分为两种:以次数控制的计数循环和以环境控制的条件循环(之后会讲到)
通过计数控制的循环,叫for循环。for循环会多次重复指令,不管结果如何。比如说,在我叫你“向我走5步”的时候,你我之间可能隔着一堵砖墙,但如果你真要严格执行我的指令,那是不可能阻止你向我走来的。你可能中途被砖墙给挡住了,但你已经正确地执行了我的指令。
while循环属于条件循环,是通过循环的条件来控制循环次数的。在满足条件之前,循环会持续运行。假设我告诉你:向前走,一直走到我身边。”这次的情形和上面让你向我走5步的情形不同,你可能得花点时间绕墙啦!
我们再想想前面做奶酪三明治的算法,是不是只给一片面包涂抹黄油就花了不少功夫?如果能够运用循环,那效率是不是会提高很多呢?
做个升级版的奶酪三明治
1.拿起一片面包。
2.将面包放在厨房的操作台上。
3.把黄油盒的盖子打开。
4.把盖子放下。
5.握住手柄拿起刮取黄油的小刀。
6.一只手握住小刀的手柄,让刀口向外。
7.放低小刀并在黄油上刮取三秒钟。
8.拿起小刀。
9.使小刀靠近面包片。
10.放低小刀,在面包片上涂抹三秒钟,一共涂抹两次。
11.重复以上1~10步。
注意到了吗?我们只要多加一条指令,就能省下不少时间,也能使奶酪三明治的口感更好。这样我们就完善了算法的前半部分,那么对后半部分还需要做些什么吗?
12.把小刀放在操作台上。
13.拿起一片奶酪。
14.把奶酪片放在涂有黄油的两片面包片中的一片上。
15.再拿来另一片涂有黄油的面包片。
16.将其覆盖在有奶酪的面包片上。
在算法中,我们必须修改一个步骤,来处理另外一片已经抹有黄油的面包片。这样,把循环引入算法中,通过修改一个语句几乎就能完成双倍的编程工作!
或许你已经意识到了,我们把循环加进算法以后,又出现了新的问题。我们没有为制作三明治的程序发布停止重复1~10步的指令!要知道计算机可是完全按照你的指令行事的。步骤11出现了无限循环——这是一定要避免的。按照我们书写的算法,计算机会一直为面包片涂抹黄油,直到没有面包片可用,最后程序崩溃,这样就糟糕了。因此我们必须对程序进行修补,我们可以为步骤11做如下修改:
11.重复以上1~10步,给两片面包片涂完黄油终止。
这样,在算法中,我们就为循环在其完成之前加上了一个特定的条件。现在,我们可以品尝美味的(也是制作高效的)奶酪三明治了。
其他循环
以下是一款流行的扑克牌游戏,你能从游戏说明中找到循环吗?
“钓鱼”游戏规则:
参与游戏人数:2~6人
游戏目标:集齐尽可能多的“册牌”。一册牌即为牌面数字相同花色不同的四张牌(如四个A、四个2)。
1.给每位玩家发五张牌(若只有两三位玩家,则每人发七张牌)。然后把剩下的牌牌面朝下放在中间,成为“池塘”。
2.从发牌者左边的人开始,为第一位玩家,他可以根据手中的牌向另一位玩家要一张牌,要的这张牌一定要和自己手中至少一张牌数字相同,不可以要(或者钓)一张和自己手中牌面数字不同的牌。
3.如果那位玩家手中有被要的牌,则必须交给这位要牌的玩家。
4.成功之后,这位玩家再继续问其他玩家要牌。
5.如果被要牌的玩家手中没有这位玩家所要的牌,他就告诉这位玩家“去钓鱼吧”。于是这位玩家就从中间的池塘中拿出一张牌。然后,就轮到下一位玩家来要牌。
6.一旦玩家手中有四张数字相同花色不同的牌(一册牌),玩家就拿出来,放在自己的面前。
7.如果玩家手中一张牌也没有了,就从池塘中拿一张。
8.当池塘中没有牌时游戏结束,拥有册牌多者获胜。在步骤1中,发牌者给每位玩家轮番发牌时,我们就可以看到第一个循环(循环1)。“先给第一位玩家发一张牌,再给第二位玩家发一张牌,再给第三位玩家……”你可以想象如果指令是这样的,该有多么无聊!其实,只需一个指令,发牌者就会不断发牌,最多可以发出30张,最少可以发出14张。
接着,游戏开始以后,在步骤2中又是一个循环(循环2)。
一位玩家向其他玩家要牌,直至要不到牌的这个过程又是一个循环(循环3)。
游戏结束后,循环1才最终结束。
明日预告:写给所有人的编程思维-条件语句(条件循环)篇
今日内容节选自《写给所有人的编程思维》,作者:吉姆.克里斯蒂安 ,如侵权,联系本号删除
Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved