易错点

赋值语句右边取的是旧值

框图处理框里的 S=S+2SS=S+2^{S} 是「把右边算出来的数装进左边」,右边两个 SS 用的都是这一轮进来时的旧值;当成方程去解、或右边偷用刚算出的新值,都会把循环跑歪。

错在哪

数学里 S=S+2SS=S+2^{S} 是一句断言——它宣称某个数满足这个等式,于是可以移项得 2S=02^{S}=0,判它无解。

框图里同一串字符是一句命令:先把右边 S+2SS+2^{S} 按当前的 SS 算成一个具体的数,再把这个数装回 SS 这个盒子里。 右边的两个 SS 是同一个旧值,左边的 SS 是即将被覆盖掉的那个盒子。它不是方程,没有「解」可言。

同一句话还有第二种读歪的方式:右边偷用刚刚算出来的新值。比如把 S=S+2SS=S+2^{S} 读成「先把 SS 加上去,再拿加完的结果当指数」, 得到的就成了另一条递推,跑几轮之后数字全乱。

翻车现场

2009 年浙江卷(理)第 6 题的循环体是 S=S+2SS=S+2^{S},k=k+1k=k+1,初值 S=0S=0、k=0k=0,当 S<100S<100 时继续。

按「右边全取旧值」老老实实跑:

轮数进来时的 SS右边算出来的数轮末的 SS
1000+20=10+2^{0}=111
2111+21=31+2^{1}=333
3333+23=113+2^{3}=111111
4111111+211=205911+2^{11}=205920592059

第 4 轮末 S=2059S=2059,跳出,输出 k=4k=4。

两种典型的读歪:

  • 当成方程:S=S+2S⇒2S=0S=S+2^{S}\Rightarrow 2^{S}=0,无解,于是断言「循环一轮都跑不了」或者「死循环」——框图根本不问这个。
  • 右边用新值:第 1 轮先把 SS 记成 0+20=10+2^{0}=1,再拿新的 11 去当指数写成 1+21=31+2^{1}=3,一轮顶了两轮,四轮的活三轮就干完,输出就少了 11。

怎么防

  • 把赋值念成「装进去」:「把 S+2SS+2^{S} 的值装进 SS」。念出来就不会去移项。
  • 列表时专列「进来时的值」一栏。右边所有出现的变量一律从这一栏取数,写完一行再填「轮末的值」。
  • 循环体里有多条赋值时,按框图自上而下逐条执行:上一条更新过的变量,下一条才用新值;同一条里左右两边的同名变量,右边永远是旧的。
  • 收口检查:把最后一轮的数字代回原式,看等号两边是不是「旧 →\to 新」而不是「新 == 新」。

学它之前先会

共 1 条前置、最深 1 层。

共 1 道题考到本条。