人人都能学编程
English 开始学习
课程 1 · 零基础入门第 5 课 / 共 10 课免费阅读

循环里的规律 · 机器人闯关

怎样找出任务里重复的那一部分?

课程目录

为什么需要它

真实的任务很少只重复一条指令,更常见的是一组指令在重复:「走、捡、走、捡」。找出这一组,也就是规律 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()
逐步执行
  1. L2第 1 轮:走到第一颗宝石……i = 0
  2. L3……捡起来。一轮 = 一颗宝石。i = 0
  3. L2第 2 轮的处境和第 1 轮一样:面朝东,前面一颗宝石。i = 1
  4. L45 轮后宝石全部捡完,最后再走一步到旗子。

四行是一级楼梯,三轮就爬三级。

for i in range(3):
    move()
    turn_left()
    move()
    turn_right()
逐步执行
  1. L2向前一格。
  2. L3转身朝上。
  3. L4向上一格。
  4. L5转回朝前:和这一轮开始时的处境一样。
  5. •第 3 轮结束,小码站在旗子上。

常见错误

一轮结束时处境变了

如果一轮结束后小码的朝向变了,下一轮就会走错。每轮结束时都检查一下朝向。

差一个

第一步或最后一步常常和中间不一样(比如最后走到旗子的那一步),把它放在循环前面或后面。

小测验

1. 小码最后停在哪里?

for i in range(3):
    move()
    move()
  1. A旗子上
  2. B走到一半,离起点 3 格
  3. C撞墙
查看答案

答案:A

3 轮 × 2 步 = 6 步,正好到旗子。

2. 小码最后停在哪里?

for i in range(2):
    move()
    turn_right()
  1. A房间正中间那格
  2. B右上角
  3. C旗子上
查看答案

答案:A

第 1 轮:向东走,转向南。第 2 轮:向南走,转向西。小码停在正中间。

动手练习

3 道练习,分三层:先预测程序的输出,再按新需求改程序,最后从零写一个。代码在浏览器里运行,提交马上判题。

  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.