追踪表(trace table)记录算法运行时每个变量的值。要把它和输出联系起来,请找出 OUTPUT 语句所指名的变量,并从程序运行到该语句时的那一行读取它的值。然后解释循环为什么在那里结束。
这一课属于解题说明单元。它建立在说明变量的用途之上,因为你要知道哪个变量才是答案;追踪的方法则来自算法设计。
怎样把表格和输出联系起来?
- 建表: 每个变量一列,每次更新一行。
- 标出循环测试失败的那一行。 循环在第一次为假的测试处结束。
- 查看 OUTPUT 语句。 记下它指名的变量。
- 读取该变量的最终值, 取自最后一次改变它的那一行。
- 写一句话, 说明是哪个变量、值是多少,以及循环为什么停止。
例题
Total ← 0
Number ← 10
WHILE Number > 0 DO
Total ← Total + Number
Number ← Number - 3
ENDWHILE
OUTPUT Total
| 轮次 | Number > 0 ? | 之后的 Total | 之后的 Number |
|---|---|---|---|
| 开始 | 0 | 10 | |
| 1 | 10 > 0 真 | 10 | 7 |
| 2 | 7 > 0 真 | 17 | 4 |
| 3 | 4 > 0 真 | 21 | 1 |
| 4 | 1 > 0 真 | 22 | −2 |
| 测试 | −2 > 0 假 | 22 | −2 |
说明。 循环把 10、7、4 和 1 加到 Total,得到 10 + 7 + 4 + 1 = 22。第 4 轮之后,Number 是 −2,所以测试 −2 > 0 为假,循环结束。−2 从未被加上。语句 OUTPUT Total 输出 22。
再核对一次。 被加的数是 10、7、4、1(在仍大于 0 时,每个比前一个小 3)。它们的和是 22。
要提防的错误
常见的失误是读错了列或行:
输出是 −2,因为那是表里的最后一个值。
−2 是 Number 的最后一个值,但 OUTPUT 语句指名的是 Total。这个失误的另一种形式,是少追踪一轮得到 21 或 20,或者错把 −2 加进去。
改正:先看语句。它写的是 OUTPUT Total,所以读 Total 那一列。它的最后一个值是 22。
自我检测
1. 追踪这段代码,写出输出,并用一句话说明。
A ← 2
B ← 1
REPEAT
B ← B * A
A ← A + 1
UNTIL A > 4
OUTPUT B
显示答案
开始 A = 2,B = 1。第 1 轮:B = 1 × 2 = 2,A = 3,测试 3 > 4 为假。第 2 轮:B = 2 × 3 = 6,A = 4,测试 4 > 4 为假。第 3 轮:B = 6 × 4 = 24,A = 5,测试 5 > 4 为真,循环停止。输出是 24,因为 B 最后一次更新在第 3 轮,OUTPUT B 输出的就是这个值。
2. 在例题中,输出来自表中哪一行?为什么不是“测试”那一行?
显示答案
第 4 轮是最后一次改变 Total 的那一行,得到 22。“测试”那一行只是检查条件,循环体并未运行,所以 Total 仍是 22。两行的 Total 列都是 22,但这个值是在第 4 轮产生的。
3. 把例题中 Number 的初始值改成 9。输出是什么?
显示答案
Number 依次是 9、6、3,然后是 0。Total 依次是 9、15、18。第 3 轮之后 Number 是 0,0 > 0 为假,循环停止。输出是 18(9 + 6 + 3 = 18)。
接下来学什么
本单元最后一项技能,是把出错的程序缩小到最小的形式:准备最小可重现的学习例子。受限伪代码追踪训练器可以让你对照逐步追踪来检查自己的表格。
如果你的表格是对的,却在解释输出时丢分,我们的老师可以在线上一对一计算机科学补习中和你练习最后那句话。