循环只有在条件以正确的方式变化时才会结束。要修复它,就追踪条件中的变量,问一问它能否让循环在预期的地方停下。
本课属于适用大纲的伪代码。它用到赋值与比较里的追踪技能,以及重复与数组里的循环形式。
常见的终止错误有哪些?
有四种。条件变量从未被更新,或者更新让它朝错误的方向变化。
或者判断用了 <> 或 =,值跳了过去。又或者判断差一位,在需要 <= 的地方用了 <。
每一种的修法都一样:先确定循环应该做什么,再让更新和判断相互吻合。
示例讲解
这个循环本应加上 1、3、5、7、9,然后停止。
Total ← 0
Count ← 1
WHILE Count <> 10 DO
Total ← Total + Count
Count ← Count + 2
ENDWHILE
OUTPUT Total
追踪前几轮:
| 轮次 | 判断时的 Count | Count <> 10 | 循环体后的 Total | 循环体后的 Count |
|---|---|---|---|---|
| 1 | 1 | TRUE | 1 | 3 |
| 2 | 3 | TRUE | 4 | 5 |
| 3 | 5 | TRUE | 9 | 7 |
| 4 | 7 | TRUE | 16 | 9 |
| 5 | 9 | TRUE | 25 | 11 |
| 6 | 11 | TRUE | 36 | 13 |
Count 只取奇数,所以跳过了 10,判断永远是 TRUE。循环永远不会终止。
修复: 把判断改为 WHILE Count < 10 DO。现在第 5 轮结束时 Count = 11,判断 11 < 10 为 FALSE,循环停止。Total 是 25。检查:1 + 3 + 5 + 7 + 9 = 25。
要留意的错误
常见失误是只治症状,不治原因。
错误的修复: 把
Count + 2改成Count + 1,好让 Count 能到 10。循环现在会停止,但它加的是 1 + 2 + 3 + … + 9 = 45。算法不再做原本想做的事。
正确做法是保留预期的行为,改动判断条件。当变量每次增加超过 1 时,应使用 < 或 <=,而不是 <>,因为“不等于”只有在值一定会落在目标上时才安全。
自我检查
1. X ← 20,WHILE X > 0 DO,X ← X - 6,ENDWHILE。最后 X 是多少?循环运行几次?
显示答案
X 依次是 20、14、8、2,然后是 -4。循环体运行 4 次,X 最后是 -4。
2. 为什么 Flag ← TRUE,WHILE Flag = TRUE DO OUTPUT "Hi" ENDWHILE 永远不会结束?
显示答案
循环内没有任何语句改变 Flag,所以条件一直是 TRUE。需要在合适的条件下加入类似 Flag ← FALSE 的更新。
3. 以 Count ← 1 开始,然后 REPEAT Count ← Count + 1 UNTIL Count > 5。最后 Count 是多少?
显示答案
Count 依次是 2、3、4、5、6。当 Count 为 6 时停止,所以 Count 是 6。
接下来学什么
用选择记法前先确认考试年份结束本单元。受限伪代码追踪训练器会在安全上限处停止失控的循环,所以你可以测试有问题的循环而不会让页面卡住。
调试能力来自看到自己的错误被解释清楚。这正是我们的老师在线上一对一计算机科学补习中所做的事。