易错点

循环次数和计数器读岔一步

循环体跑完才更新计数器、跑完才做判断,于是退出时计数器已经比实际轮数多一;输出的是计数器,不是轮数。

错在哪

一段循环里有两个东西在动:循环体跑了几轮,和计数器变量此刻等于几。它们只在一种巧合下相等,其余时候都差一个常数,而这个常数由三件事决定:

  1. 计数器的初值(i=1i=1 还是 i=0i=0);
  2. 计数器的更新在循环体的哪一步(先用后加,还是先加后用);
  3. 判断框在循环体之前还是之后。

第 3 条尤其要盯。判断框在循环体之后,是「做完再判」:条件成立时循环体已经跑完了这一轮,计数器也已经加过了,退出时看到的计数器值属于下一轮。判断框在循环体之前,是「先判再做」:条件不成立就一轮都不跑。

翻车现场

2014 年浙江卷(理)第 11 题的框图是:S=0S=0,i=1i=1;循环体 S=2S+iS=2S+i,i=i+1i=i+1;然后判断 S≥nS\ge n,否则绕回循环体。输入 n=50n=50。

逐轮跑:

轮数 kk这一轮用的 ii轮末的 SS轮末的 iiS≥50S\ge 50?
1112否
2243否
33114否
44265否
55576是

循环体只跑了 5 轮,输出的却是 i=6i=6。答案是 66 不是 55——因为 ii 在判断之前就已经加成了 66。

写成 55 的人,做的其实是「数一数跑了几轮」;写成 77 的人,多半是以为退出后还要再加一次。

怎么防

  • 列表时把「轮末的 ii」单独列一栏,不要只记 SS。表一列出来,差不差一目了然。
  • 先读判断框的位置,再读循环体。位置定了,「至少跑一次」还是「可能一次不跑」就定了。
  • 收口时回头问一句:题目问的是轮数还是变量的值?框图里写的是「输出 ii」,那就照 ii 退出时的值答,不要自己换算成轮数。
  • 边界也要读死:S≥nS\ge n 与 S>nS>n 在 SS 恰好等于 nn 的那一轮给出不同答案,本题 57≠5057\ne 50 才让两种读法碰巧同解。

共 6 道题考到本条。