9. 条件循环

9.1 目标

  • 学习在不知道循环次数的情况下,重复命令序列直到满足某条件.

条件循环(while循环)在各种过程化编程语言中都存在.

它可以使我们在事先不确切知道循环次数的情况下执行循环.比如,使Karel径走到最近的墙处.由于它不可能事先度量到达墙的距离,因此不可能通过repeat命令实现.

9.2 寻找遗失的宝石

为了说明while循环的用法,我们考虑如下图所示的情形.Karel随机站在迷宫的中间,它之前沿着围墙走的时候遗失了一枚宝石,它不确定在什么位置,只是知道在外围墙边上的某个地方. 让我们来写一个程序帮助机器人找到这个宝石.

_images/9_01.png

图1.在围墙边上有一枚宝石

以下5行程序可完成任务:

while not gem
  while not wall
    go
  left
get

9.3 分解步骤写程序

写上面那样的程序难吗? 一点也不! 但是我们有必要一步一步构造,而不是试图一次性写好.这种方式是很多有经验的程序员的方式.第一步,写一个循环将机器人引向围墙.很明显,为了得到宝石必须先走道围墙边.之后,我们将机器人左转(或右转),面向墙壁总不能将机器人引向他处:

while not wall
  go
left

看这个程序,我们意识到它可以将机器人引向下一个角落并左转.这非常好,我们可以不断重复这个过程直到找到宝石!因此作为第二步,我们再添加一个外循环:

while not gem
  while not wall
    go
  left

作为第三步,Karel需要拾起地上的宝石.于是我们得到了上述完整的程序:

while not gem
  while not wall
    go
  left
get

9.4 爬岩石山

这次Karel站在一个很高的悬崖前面:

_images/9_02.png

图2.Karel爬悬崖

它知道悬崖上有一个宝石,希望得到它,但是它不知道悬崖有多高,也不知道宝石的确切位置. 让我们帮助它爬上悬崖得到宝石!

通过以下7行程序可以实现:

while wall
  left
  go
  right
while not gem
  go
get

作为练习,不妨扩展这个程序使Karel爬下悬崖并回到原始位置.