解释算法,就是说明它的目的、处理的对象、每一步做了什么以及为什么。 代码只是写出算法的一种方式。解释讲的是思路,要让看不到代码的人也能明白。
这是一项贯穿问题解决与解释和算法设计的推理技能。不依赖编程语言来解释算法这一课直接练习这一点。
为什么这么难?
写代码时,每一行都有固定含义,其余交给计算机。解释时你得自己选词,于是出现两个陷阱:一是把代码逐行翻译成中文,二是说些模糊的话,比如“它检查所有东西”。
两者都是因为解释没有框架。用一个简单的框架就能解决。
四部分框架
- 目的: 一句话说明算法要找出或完成什么。
- 输入与输出: 输入什么,输出什么。
- 用文字写步骤: 两到四句,按顺序,每句说明数据发生了什么。
- 原因或检验: 为什么可行,或用示例数值做跟踪。
例题
这个算法在一组分数中找出最高分。示例列表:14、9、21、17。
目的。 找出列表中最大的分数。
输入与输出。 输入是至少含一个元素的整数列表。输出是列表中最大的值。
用文字写步骤。 算法先把第一个分数当作目前见过的最大值。接着依次查看其余每个分数。每当某个分数比目前最大值大,这个分数就成为新的最大值。看完最后一个分数后,保存的值就是答案。
用示例列表跟踪。
| 查看的分数 | 看完这个分数后的目前最大值 |
|---|---|
| 14(第一个) | 14 |
| 9 | 14(9 不更大) |
| 21 | 21(21 更大) |
| 17 | 21(17 不更大) |
输出是 21。
原因。 保存的值始终是已查看分数中最大的,所以到最后它就是整个列表中最大的。
薄弱与有力的对比
薄弱的解释:“有一个循环。用 if 语句比较。然后输出变量。”
这只是点出代码的特征,对分数只字未提,也没有解释为什么结果是最大值。读者仍然不知道算法实现了什么。
有力的解释:“先把第一个分数当作目前最大值,再依次检查其余每个分数。如果某个分数更大,就替换保存的最大值。最后保存的值就是最高分,因为每当出现更大的分数它都会被更新。”
它按顺序说明了数据发生了什么,并给出了原因。
要避免的错误
错误:描述代码特征,而不是描述行为。 循环、变量、if 语句这些词适合用在写代码的答案里。解释题想要的是数据发生了什么。
更正: 对每一句话问一句:“这里分数发生了什么?”如果这句话可以放在任何程序上,就太模糊了。补上数据和动作。
怎么练习
- 选一个你已经写过的算法。
- 盖住代码,凭记忆写出四部分框架。
- 用一个小列表做跟踪,确认你写的话是真的。
- 换一个示例列表,检查解释是否依然成立。
伪代码跟踪训练器在小型原创算法上演示逐步执行,Python 推理沙盒让你快速测试想法,使你的解释描述的是真正可行的东西。
自测
1. 为一个统计列表中不少于 50 分的人数的算法,写一句目的。
Show answer
“统计列表中 50 分或以上的分数有多少个。”好的答案点出数据(分数)、条件(不少于 50)和结果(一个计数)。2. 哪一句是更有力的步骤:“它在循环里转圈”,还是“它依次查看每个分数,并与目前最大值比较”?
Show answer
第二句。它说明了每一步数据发生了什么。“在循环里转圈”只是点出代码特征,没有说它做了什么。3. 用示例列表 14、9、21、17,查看完第三个分数后,保存的最大值是多少?
Show answer
21。第一个分数把它设为 14,第二个(9)让它保持 14,第三个(21)更大,所以保存的值变为 21。接下来
练习描述如何改正,而不只是展示代码和把跟踪与最终输出联系起来。算法设计方面,读用状态表跟踪一个序列。
当你准备好让人听你解释并帮你打磨措辞时,一对一线上计算机科学补习从 RM80 起的付费试听课开始。