算法设计,是把一段文字描述的任务变成一组清楚的步骤,让别人照着做每次都能得到正确答案。它不是背解法,而是拆解任务、说清输入与输出、并在信任步骤之前先测试。
本模块接在自动化与新兴系统之后,排在重复结构与数组之前,属于计算机科学学习指南的一部分。你在这里练习的追踪,会用在之后每一道算法题中。
开始前需要知道什么?
你需要知道什么是变量(variable),赋值语句如 Total ← Total + 5 如何改变它,以及怎样读简单的 IF 语句。如果还不确定,可以先在伪代码追踪训练器里逐步运行一个小算法,观察每个变量的变化。
你不需要会 Python。本模块使用剑桥风格的伪代码,只有在 Python 能帮你看到同一逻辑的另一种写法时才会出现。
一个引导示例
老师输入五个测验分数,每个满分 20。如果平均分至少为 10,程序输出 PASS,否则输出 FAIL。
先拆成几部分:收集五个分数,求和,除以五,与 10 比较,输出一个词。分数为 12、15、9、18、16 时,总分是 70,平均分是 14,输出是 PASS。
Total ← 0
FOR Count ← 1 TO 5
INPUT Mark
Total ← Total + Mark
NEXT Count
Average ← Total / 5
IF Average >= 10 THEN
OUTPUT "PASS"
ELSE
OUTPUT "FAIL"
ENDIF
本模块的每一课都在这幅图上增加一个习惯:拆分、写规格、追踪、测试边界、解释。
应该按什么顺序学习各课?
- 把任务分解为子问题:学会拆分任务,让每一部分小到可以测试。
- 定义输入、输出和限制条件:准确说明什么进来、什么出去、什么被允许。
- 用状态表追踪一个序列:逐行跟踪变量,以便检查任何算法。
- 设计带边界情况的选择结构:写 IF 结构,并测试决策改变的那些值。
- 不依赖编程语言来解释算法:用普通步骤和伪代码描述逻辑。
然后做综合练习,把错题记在错题记录里。熟悉两种写法之后,可以用安全 Python 沙盒把伪代码追踪与一段短程序做对照。
学生在这个课题中常踩哪些坑?
- 子问题只是把整个任务重说一遍。 “算出结果”无法测试。继续拆,直到每一部分只有一个明确的任务。
- 跳过初始值。 从第一次更新之后才开始的追踪,会掩盖初始化错误。
- 误用大于等于。 符号
>和>=恰好只在一个值上给出不同答案。 - 只测试典型数据。 大多数错误出现在边缘,比如 0、界限本身,以及两侧相邻的值。
- 描述代码而不是逻辑。 依赖某种语言内置函数的解释,无法证明你理解了算法。
如何使用练习题
在纸上完成。先写好追踪表,再看答案,并先预测最终输出。对照的是解题过程,而不只是最后一行,然后记下每个错误属于哪一课。
如果你希望老师看看你如何设计并检查自己的算法,我们的一对一在线计算机科学补习正是围绕追踪和调试你自己的作答来进行的。