跳到正文
IGCSE·Tuition
计算机科学 · 课程

修复伪代码循环的终止条件

永不停止或早停一轮的循环,可能藏在一个看起来完全合理的算法里。

本页内容
  1. 常见的终止错误有哪些?
  2. 示例讲解
  3. 要留意的错误
  4. 自我检查
  5. 接下来学什么

循环只有在条件以正确的方式变化时才会结束。要修复它,就追踪条件中的变量,问一问它能否让循环在预期的地方停下。

本课属于适用大纲的伪代码。它用到赋值与比较里的追踪技能,以及重复与数组里的循环形式。

常见的终止错误有哪些?

有四种。条件变量从未被更新,或者更新让它朝错误的方向变化。

或者判断用了 <> 或 =,值跳了过去。又或者判断差一位,在需要 <= 的地方用了 <。

每一种的修法都一样:先确定循环应该做什么,再让更新和判断相互吻合。

示例讲解

这个循环本应加上 1、3、5、7、9,然后停止。

Total ← 0
Count ← 1
WHILE Count <> 10 DO
   Total ← Total + Count
   Count ← Count + 2
ENDWHILE
OUTPUT Total

追踪前几轮:

轮次判断时的 CountCount <> 10循环体后的 Total循环体后的 Count
11TRUE13
23TRUE45
35TRUE97
47TRUE169
59TRUE2511
611TRUE3613

Count 只取奇数,所以跳过了 10,判断永远是 TRUE。循环永远不会终止。

修复: 把判断改为 WHILE Count < 10 DO。现在第 5 轮结束时 Count = 11,判断 11 < 10 为 FALSE,循环停止。Total 是 25。检查:1 + 3 + 5 + 7 + 9 = 25。

要留意的错误

常见失误是只治症状,不治原因。

错误的修复: 把 Count + 2 改成 Count + 1,好让 Count 能到 10。

循环现在会停止,但它加的是 1 + 2 + 3 + … + 9 = 45。算法不再做原本想做的事。

正确做法是保留预期的行为,改动判断条件。当变量每次增加超过 1 时,应使用 < 或 <=,而不是 <>,因为“不等于”只有在值一定会落在目标上时才安全。

自我检查

1. X ← 20,WHILE X > 0 DO,X ← X - 6,ENDWHILE。最后 X 是多少?循环运行几次?

显示答案

X 依次是 20、14、8、2,然后是 -4。循环体运行 4 次,X 最后是 -4。

2. 为什么 Flag ← TRUE,WHILE Flag = TRUE DO OUTPUT "Hi" ENDWHILE 永远不会结束?

显示答案

循环内没有任何语句改变 Flag,所以条件一直是 TRUE。需要在合适的条件下加入类似 Flag ← FALSE 的更新。

3. 以 Count ← 1 开始,然后 REPEAT Count ← Count + 1 UNTIL Count > 5。最后 Count 是多少?

显示答案

Count 依次是 2、3、4、5、6。当 Count 为 6 时停止,所以 Count 是 6。

接下来学什么

用选择记法前先确认考试年份结束本单元。受限伪代码追踪训练器会在安全上限处停止失控的循环,所以你可以测试有问题的循环而不会让页面卡住。

调试能力来自看到自己的错误被解释清楚。这正是我们的老师在线上一对一计算机科学补习中所做的事。

常见问题

什么是终止条件(termination condition)?

它是决定循环何时停止的判断。WHILE 循环在条件为 TRUE 时运行;REPEAT 循环运行到条件变成 TRUE 为止。当判断中的变量永远达不到停止值时,就出现了错误。

WHILE 和 REPEAT 在终止上有什么不同?

WHILE 先判断,所以可能一次都不运行。REPEAT 后判断,所以至少运行一次。WHILE 的条件描述何时继续;REPEAT 的条件描述何时停止。

怎样在追踪中发现无限循环?

追踪四五轮,观察条件里的变量。如果它远离停止值、跳过停止值,或者根本不变,循环就不会结束。然后修改更新语句或判断条件。

更新于:

下一步

如果你能手动运行循环,却还看不出某个循环为什么出错,一对一老师可以给你有问题的循环来修复,直到你熟悉这种模式。

一小时付费试听课,按所安排老师确认的收费,RM80 起。 其他费用、时间安排及后续课程,在试听课后由家长与老师直接确认。

补习由家长或监护人安排。用 WhatsApp 把这页发给他们,他们就可以替你咨询。

是家长或监护人?在这里咨询

已通过我们的服务帮助 9,000+ 名学生