循环里的规律 · 机器人闯关
怎样找出任务里重复的那一部分?
课程目录为什么需要它
真实的任务很少只重复一条指令,更常见的是一组指令在重复:「走、捡、走、捡」。找出这一组,也就是规律 Pattern,是写循环最关键的本领。看出规律,循环几乎就写好了。
直觉理解
爬楼梯:「向前一步、向上一步」,一遍又一遍。楼梯的一级就是规律:
move() # 向前
turn_left() # 面朝上
move() # 向上
turn_right() # 再面朝前把这四行放进循环体,range(3) 就能爬三级。
一个好用的检查方法:做完一轮之后,小码的处境是不是和开始时一样(朝向相同,前面又是下一级)?是的话,这个规律就能重复。
定义
规律 Pattern
A pattern is a group of steps that repeats; it becomes the body of a loop.规律就是会重复出现的一组步骤,它就是循环体。
示例
一排宝石
在互动课里运行规律是:走、捡。最后那个 move() 在循环外面。
for i in range(5):
move()
pick()
move()逐步执行
- L2第 1 轮:走到第一颗宝石……
i = 0 - L3……捡起来。一轮 = 一颗宝石。
i = 0 - L2第 2 轮的处境和第 1 轮一样:面朝东,前面一颗宝石。
i = 1 - L45 轮后宝石全部捡完,最后再走一步到旗子。
爬楼梯
在互动课里运行四行是一级楼梯,三轮就爬三级。
for i in range(3):
move()
turn_left()
move()
turn_right()逐步执行
- L2向前一格。
- L3转身朝上。
- L4向上一格。
- L5转回朝前:和这一轮开始时的处境一样。
- •第 3 轮结束,小码站在旗子上。
常见错误
一轮结束时处境变了
如果一轮结束后小码的朝向变了,下一轮就会走错。每轮结束时都检查一下朝向。
差一个
第一步或最后一步常常和中间不一样(比如最后走到旗子的那一步),把它放在循环前面或后面。
小测验
1. 小码最后停在哪里?
for i in range(3):
move()
move()查看答案
答案:A
3 轮 × 2 步 = 6 步,正好到旗子。
2. 小码最后停在哪里?
for i in range(2):
move()
turn_right()查看答案
答案:A
第 1 轮:向东走,转向南。第 2 轮:向南走,转向西。小码停在正中间。
动手练习
3 道练习,分三层:先预测程序的输出,再按新需求改程序,最后从零写一个。代码在浏览器里运行,提交马上判题。
- 预测输出轮数不够
预测小码最后停在哪里。
- 改需求隔一格一颗
现在宝石是隔一格放一颗。修改循环体,让小码捡完三颗并走到旗子。
- 从零写宝石楼梯
沿着楼梯往下走,每一级的平台上都有一颗宝石要捡,最后站到旗子上。用循环写,最多 7 行。
本课术语
| 术语 | 中文 | 英文定义 |
|---|---|---|
| Pattern | 规律 | A group of steps that repeats and becomes the body of a loop. |
| Off-by-one error | 差一错误 | A bug where a loop runs one time too many or too few. |