要找列表的最大值(maximum),用一个变量保存目前见过的最大值,并把其他每个项目与它比较。每当某个项目更大,就用它取代保存的值。
这一课把追踪计数控制循环中的循环用在数组上。它属于重复与数组模块,同样的模式还能用来求最小值、计数和求和。
步骤是什么?
- 把
Max设为列表中的第一个项目。 - 循环处理其余项目,从位置 2 到最后一个位置。
- 如果当前项目大于
Max,就把它复制进Max。 - 循环结束后,
Max保存的就是最大值。
例题详解
数组 Scores[1:6] 存有 35, 48, 22, 48, 51, 40。
Max ← Scores[1]
FOR i ← 2 TO 6
IF Scores[i] > Max
THEN
Max ← Scores[i]
ENDIF
NEXT i
OUTPUT Max
Max 一开始是 35。
| i | Scores[i] | Scores[i] > Max? | 之后的 Max |
|---|---|---|---|
| 2 | 48 | 48 > 35 真 | 48 |
| 3 | 22 | 22 > 48 假 | 48 |
| 4 | 48 | 48 > 48 假 | 48 |
| 5 | 51 | 51 > 48 真 | 51 |
| 6 | 40 | 40 > 51 假 | 51 |
输出是 51。位置 4 存有相等的值 48,因为 48 > 48 为假,所以不会取代 Max。
如果还要报告最大值在哪里,就把位置也存起来:
Max ← Scores[1]
MaxPos ← 1
FOR i ← 2 TO 6
IF Scores[i] > Max
THEN
Max ← Scores[i]
MaxPos ← i
ENDIF
NEXT i
OUTPUT MaxPos, Max
对同样的数据,MaxPos 在 i = 2 和 i = 5 时改变。输出是 5, 51。
要留意的错误
常见的失误是以 Max ← 0 开始。
错误的算法:
Max ← 0,然后把包括第一个在内的每个项目都拿来比较。对温度 -5、-2 和 -9,没有一个值大于 0,所以算法输出 0。这个值根本不在列表中。
纠正的方法是 Max ← Temps[1],然后从位置 2 开始循环。追踪:Max 是 -5,然后 -2 > -5 为真,Max 变成 -2,接着 -9 > -2 为假。输出是 -2,正确。
自我检测
1. 用数据 8, 3, 12, 12, 5 追踪这个算法。每个项目之后 Max 是多少?
显示答案
从 8 开始。然后 3 > 8 假(8),12 > 8 真(12),12 > 12 假(12),5 > 12 假(12)。最终值是 12。
2. 要对同样的数据求最小值,哪一个符号要改?结果是什么?
显示答案
把 > 改成 <。从 8 开始,然后 3 < 8 真(3),之后 12、12 和 5 都不小于 3。最小值是 3。
3. 数据 6, 9, 9, 2 存在 Data[1:4] 中。记录位置的版本会给出什么位置?改用 >= 会怎样?
显示答案
用 > 时,位置 2 的 9 先被保存,第二个 9 不会取代它,所以位置是 2。用 >= 时,第二个 9 取代了它,所以位置是 3。两种情况下值都是 9。
接下来学什么
接下来仔细看循环变量 i 与它所指向的项目有什么不同:使用数组下标,不把它与值混淆。想试试自己的列表,可以用 Python 推理沙盒,并把结果与你的追踪表比较。
一对一线上计算机科学补习的老师可以给你一些特殊的列表,例如含负数或重复值,让你学会预测算法会在哪里失败。