条件控制循环会一直重复,直到某个条件叫它停止,次数不是事先固定的。Cambridge 风格的伪代码有两种形式:WHILE 配 ENDWHILE,以及 REPEAT 配 UNTIL。
这一课接在追踪计数控制循环之后,属于重复与数组模块。新的想法是:决定循环何时结束的是测试,而不是计数器。
两种循环分别在什么时候检查条件?
WHILE 循环先测试。如果第一次检查时条件就为假,循环体一次都不会运行。
REPEAT 配 UNTIL 的循环先运行循环体,之后才测试。循环体至少运行一次。当 UNTIL 的条件为真时循环停止,这与 WHILE 刚好相反。
每次追踪都加一列记录测试,每检查一次就写下真或假。
例题一:WHILE 循环
Balance ← 100
Years ← 0
WHILE Balance < 150 DO
Balance ← Balance + 20
Years ← Years + 1
ENDWHILE
OUTPUT Years, Balance
| 测试:Balance < 150 | 之后的 Balance | 之后的 Years |
|---|---|---|
| 100 < 150 真 | 120 | 1 |
| 120 < 150 真 | 140 | 2 |
| 140 < 150 真 | 160 | 3 |
| 160 < 150 假 | 循环结束 |
输出是 3, 160。最后一次测试为假,所以没有第四轮。
例题二:REPEAT 循环
N ← 64
Steps ← 0
REPEAT
N ← N DIV 2
Steps ← Steps + 1
UNTIL N < 5
OUTPUT Steps, N
DIV 是整数除法(只取整数部分)。
| 轮次 | 之后的 N | 之后的 Steps | 测试:N < 5 |
|---|---|---|---|
| 1 | 32 | 1 | 假,继续 |
| 2 | 16 | 2 | 假,继续 |
| 3 | 8 | 3 | 假,继续 |
| 4 | 4 | 4 | 真,停止 |
输出是 4, 4。如果 N 一开始是 3,用同样测试写成 WHILE N >= 5 的 WHILE 循环会运行零次,但这个 REPEAT 循环仍会运行一次,把 N 变成 1。
要留意的错误
常见的失误是把 UNTIL 读成”当……时继续”。
错误答案: “UNTIL N < 5 表示 N 小于 5 时循环继续,所以它马上就停。”
学生把 UNTIL 条件当成了 WHILE 条件。
纠正的方法是把 UNTIL N < 5 读成”一旦 N 小于 5 就停止”。一开始 N 是 64,不小于 5,所以循环继续。在每个 UNTIL 旁边的页边写上”何时停”。
自我检测
1. 最后 X 的值和运行的轮数各是多少?
X ← 5
Passes ← 0
WHILE X > 0 DO
X ← X - 2
Passes ← Passes + 1
ENDWHILE
查看答案
X 依次为 5、3、1,然后是 -1。测试结果:5 > 0 真,3 > 0 真,1 > 0 真,-1 > 0 假。循环运行了 3 轮,X 是 -1。
2. 最后 Count 是多少?
Count ← 10
REPEAT
Count ← Count + 1
UNTIL Count >= 10
查看答案
循环体在任何测试之前先运行一次,所以 Count 变成 11。然后 11 >= 10 为真,循环停止。Count 是 11。
3. 为什么这个循环永远不会结束?
N ← 10
WHILE N <> 0 DO
N ← N - 3
ENDWHILE
查看答案
N 依次取 10、7、4、1、-2、-5 等。它越过了 0,从来不等于 0,所以 N <> 0 永远为真。改用 WHILE N > 0 就能修好。
接下来学什么
循环总是在边界处以可预测的方式出错,这就是修复差一错误的主题。想一步步看条件如何变化,可以使用伪代码追踪训练器,它会在安全上限处停止失控的循环。
计算机科学补习的老师可以给你几个新的循环来追踪,直到先检查停止条件成为你的第一反应。