循环次数和计数器读岔一步
循环体跑完才更新计数器、跑完才做判断,于是退出时计数器已经比实际轮数多一;输出的是计数器,不是轮数。
错在哪
一段循环里有两个东西在动:循环体跑了几轮,和计数器变量此刻等于几。它们只在一种巧合下相等,其余时候都差一个常数,而这个常数由三件事决定:
- 计数器的初值( 还是 );
- 计数器的更新在循环体的哪一步(先用后加,还是先加后用);
- 判断框在循环体之前还是之后。
第 3 条尤其要盯。判断框在循环体之后,是「做完再判」:条件成立时循环体已经跑完了这一轮,计数器也已经加过了,退出时看到的计数器值属于下一轮。判断框在循环体之前,是「先判再做」:条件不成立就一轮都不跑。
翻车现场
2014 年浙江卷(理)第 11 题的框图是:,;循环体 ,;然后判断 ,否则绕回循环体。输入 。
逐轮跑:
| 轮数 | 这一轮用的 | 轮末的 | 轮末的 | ? |
|---|---|---|---|---|
| 1 | 1 | 1 | 2 | 否 |
| 2 | 2 | 4 | 3 | 否 |
| 3 | 3 | 11 | 4 | 否 |
| 4 | 4 | 26 | 5 | 否 |
| 5 | 5 | 57 | 6 | 是 |
循环体只跑了 5 轮,输出的却是 。答案是 不是 ——因为 在判断之前就已经加成了 。
写成 的人,做的其实是「数一数跑了几轮」;写成 的人,多半是以为退出后还要再加一次。
怎么防
- 列表时把「轮末的 」单独列一栏,不要只记 。表一列出来,差不差一目了然。
- 先读判断框的位置,再读循环体。位置定了,「至少跑一次」还是「可能一次不跑」就定了。
- 收口时回头问一句:题目问的是轮数还是变量的值?框图里写的是「输出 」,那就照 退出时的值答,不要自己换算成轮数。
- 边界也要读死: 与 在 恰好等于 的那一轮给出不同答案,本题 才让两种读法碰巧同解。
出现在以下题目中
共 6 道题考到本条。