捡宝石 · 机器人闯关
目标不止一个时,怎么规划一段更长的程序?
课程目录为什么需要它
现在小码有了任务:捡起所有宝石,然后站到旗子上。程序经常要同时完成好几件事。把任务拆成一小段一小段(「走到宝石 1、捡起来、走到宝石 2……」),是程序员管理长程序的基本方法。
直觉理解
想想购物清单:走到 3 号货架,拿牛奶,走到 5 号货架,拿面包,去收银台。每一项都是一个小目标。
pick() 捡起小码脚下那一格的宝石。如果那里没有宝石,小码会报错停下,就像你没法从空货架上拿牛奶一样。
只有捡完全部宝石、并且站在旗子上,这一关才算通过。
定义
分解 Decomposition
Decomposition is breaking a problem into smaller parts that are easier to solve one at a time.分解就是把一个问题拆成几个更小、更容易逐个解决的部分。
示例
路上一颗宝石
在互动课里运行小码走到宝石那里,捡起来,再继续走到旗子。
move()
move()
pick()
move()
move()逐步执行
- L1第一部分:走到宝石(第一格)。
- L2第二格:小码站在宝石上。
- L3第二部分:捡起来,宝石计数变成 1/1。
- L4第三部分:走向旗子。
- L5站在旗子上,宝石也捡完了:通关。
捡早了
在互动课里运行这里的 pick() 早了一行。运行看看报什么错。
move()
pick()
move()
move()
move()逐步执行
- L1小码走了一格,宝石还在前面一格。
- L2在空格上
pick():第 2 行出错。把第 2、3 行对调就好了。
常见错误
只到旗子不算通关
如果还有宝石没捡,就算小码站在旗子上也不算通关。
没有宝石时 pick()
在空格上 pick() 会报错。仔细数格子,或者每写完一部分就运行一次。
小测验
1. 会发生什么?
move()
move()
pick()
move()查看答案
答案:B
宝石在第一格。走了两步后小码已经越过它了。
2. 小码站在旗子上,但地图上还剩一颗宝石。算通关吗?
查看答案
答案:B
两个条件都要满足:宝石全部捡完,并且站在旗子上。
动手练习
3 道练习,分三层:先预测程序的输出,再按新需求改程序,最后从零写一个。代码在浏览器里运行,提交马上判题。
- 预测输出数宝石
预测结果。
- 改需求多了一颗宝石
原来只有一颗宝石时这段程序能通关。现在多了第二颗宝石,把缺的补上。
- 从零写拐角宝石
捡起两颗宝石,最后站在旗子上。
本课术语
| 术语 | 中文 | 英文定义 |
|---|---|---|
| Decomposition | 分解 | Breaking a problem into smaller parts that are easier to solve one at a time. |
| Error | 错误 | A problem that stops a program from running, reported with the line where it happened. |