1. 案例目的

这篇教程将带你轻松搞懂递归的奇妙思想!我们会学习如何用简单的代码让程序“自己调用自己”,从而画出各种复杂又漂亮的分形图案。教程还会结合经典又有趣的“Turtle”海龟绘图,让你亲眼看到编程的神奇和乐趣——快来一起试试吧!

fractal tree result koch snowflake result

2. 使用材料

cocube computer

3. 软件平台

MicroBlocks-CoCube

4. 理论知识

递归原理:

  1. 大事化小,小事一样做 把一个大问题拆成几个“更小、但长得像”的小问题,然后这些小问题再用同样的方法去拆解。

  2. 一定要喊停,不然会没完没了 递归不能无限拆下去,必须有一个“停下来的条件”。比如拆到无法再拆的最小问题时,就直接给出答案,不再继续。

举例:一个电影院的“传话”故事

想象你在一个黑漆漆的电影院里,想知道自己坐在第几排。

  • 你的动作: 你拍了拍前面那排人的肩膀,问:“哥们,请问这是第几排?”

  • 递归发生: 前面那个人也不知道,于是他也拍了拍他前面的人…… 这个过程一直持续下去。

  • 临界点(出口): 直到问到了第一排的人。第一排的人一看前面没座儿了,很确定地回答:“我是第一排!”

  • 结果回传:一直到第一排告诉第二排:“我是1。”

  • 第二排心想:“哦,那我是1 + 1 = 2。” 然后告诉第三排。

  • 信息就这样一排排传回来,最后你得到了答案。

这就是递归: 你把一个大问题(我要知道我是第几排),拆解成一个个一模一样的小问题(问前面的人),直到碰到一个不需要计算就知道答案的人(第一排),然后再把结果一层层收回来。

科赫雪花

你有没有发现,真正的雪花放大之后,边缘并不是光滑的,而是弯弯曲曲、越来越细碎?

数学家科赫在1904年就想:能不能用一条简单的规则,画出一片无限复杂的雪花?

于是,他发明了“科赫雪花”——一个用递归“长”出来的神奇图形。

绘制规则:

第 0 步:先画一个等边三角形。

第 1 步:每条边分成三段,把中间一段“凸”出一个小三角形。

第 2 步:对新的每一条边再做同样的操作。

第 3 步:继续重复……边会越来越多,图形越来越像精致的雪花。

koch snowflake example

海龟绘图积木:

把“Turtle”想象成一个拿着自动铅笔的小机器人,你写“行走计划”,它就负责照做,边走边画。

  1. 抬笔与落笔:你可以把海龟想象成自己手里拿着一支画笔。当笔尖落在画布上时,你只要移动手,就能画出五彩斑斓的线条——这就是落笔。海龟也是一样:落笔后,它每走一步都会留下痕迹。那什么时候需要抬笔呢?比如你画完一段线,想把画笔移到另一个位置重新画,又不想让移动的路线留下乱七八糟的痕迹,这时候就可以把笔尖抬起来,悄悄走过去,再落笔继续画。

pen up

pen down

  • 前进:这个积木是控制海龟移动最重要的命令。你只需要在它的参数框里填入一个数字,这个数字的单位是像素点(屏幕上最小的距离单位)。像素点的数值直接决定了画笔痕迹的长度——比如你填 10,海龟就会向前移动 10 个像素点,画出一条 100 像素长的线段。

move forward

  • 旋转:这个积木用来改变海龟当前的朝向,也就是它下一步前进的方向,你需要填入一个数字,单位是角度(°)。

  • 填入正数(如 90),海龟会顺时针旋转对应角度。

  • 填入负数(如 -90),海龟会逆时针旋转对应角度。

    注意:这个积木只改变方向,不会移动海龟,也不会画出任何线条。

turn degrees

  • 画笔精准移动:如果你已经知道画笔要去的位置(比如屏幕上某个点的 x 和 y 坐标),就不需要使用“前进”一步一步走着过去。直接用这个积木,输入目标位置的 x 值和 y 值,海龟就会快速移动到那里

go to xy

  • 颜色更改:可以通过下面两个积木进行背景颜色更改与画笔颜色调整。

fill background

set pen color

5. 绘制一棵分形树

  1. 添加积木库:想不想让小海龟听从你的指令,在屏幕上画出各种有趣的图形?很简单!在“MicroBlocks”编程环境里,只要进入左侧的“图形与显示”分类,找到“海龟库”这个模块,点击“添加积木库”,你的小海龟就准备好动笔啦!

add library button

graphics and displays

turtle library

  • 小试牛刀:想不想画出像雪花、树杈那样神奇的分形图案?别急,我们先从最简单的开始——用海龟绘图画一个等边三角形。别看它简单,这可是你迈向“分形大师”的第一步哦!一起来试试吧!

先选一支你喜欢的画笔颜色吧!为了让画出来的图案既好看又居中,我们可以先把小海龟挪到屏幕中间的位置,然后再让笔尖落下,准备开画!

select pen

画等边三角形其实很简单:

让小海龟先向前走一段,画出一条边;

然后旋转 120°,再继续走一条边;

把“走边 + 旋转”这两个动作重复执行 3 次,一个漂亮的等边三角形就完成啦!

triangle code

triangle result

  • 递归分形树:

接下来,我们来画一棵会“自己长分叉”的神奇树——分形树。

仔细观察,它的生长规则其实很简单:

  • 第 0 步:先画一根笔直的主干,就像树干一样。

  • 第 1 步:在主干的最顶端,向左、向右各画一根稍短的树枝。

  • 第 2 步:把每一根新长出来的树枝,都当成一根“小主干”。重复刚才的动作——在它们顶端再分两根更短的树枝。

  • 第 3 步:重复上面这几步,分叉越来越多,越来越细…… 只要这样重复几次,一棵枝繁叶茂的树就神奇地出现啦!

是不是很像在变魔法?这种“自己调用自己”的规则,在编程里就叫递归。别怕名字吓人,跟着步骤一步步画,你也能轻松画出一棵分形树!

fractal tree diagram

在使用“递归”这个方法之前,最重要的一步是什么?

先想好什么时候停下来!

就像前面“电影院”的例子一样——你必须确定在某个条件下,能直接得到答案,不再继续往下问。

如果不设定停止条件,递归就会一直没完没了地运行下去,最后电脑和机器人都会“卡住”不动,就像掉进了无限循环的迷宫里一样出不来。

观察这棵分形树,你会发现:每分叉一次,新长出的树枝都会比原来的更短。

所以,我们可以给递归设定一个停止条件:当树枝的长度小到某个值(比如小于 5)时,就不再继续分叉了。

另外,和“电影院例子”一样,递归到了最底层不能只是“停下”,还得把结果传回来(绘制最后一个分支并返回)。

因此,我们需要自己建一个“自定义积木”,在里面写清楚:

drawtree base case

PS:在递归中,“返回 0” 这个积木非常重要。它的作用是:结束当前这一层的调用,回到上一层,让整个递归过程能够顺利地“一层层收回来”。当然,不用“返回 0”也可以实现同样的效果。你可以直接用 “如果…否则…” 结构来写。

接下来,我们就把整棵分形树画出来啦!步骤是这样的:

  1. 画主干:先让小海龟向前走,画出当前长度的主干。

  2. 画左侧分支:把画笔向左转一个角度,然后用更短的长度画出左边的树枝。

  3. 画右侧分支:把画笔再向右转(两个角度),画出右边的树枝。

  4. 别忘了回退:画完左右分支后,小海龟还停在分叉的顶端,需要把它原路退回到分叉点,并且转回原来的方向,这样才能继续让上一级的递归正常返回。

drawtree steps

完整的积木定义如下,两种方式均可以:

drawtree definition a

drawtree definition b

在编写主程序时,我们可以先给小海龟安排一个落笔位置:

把画笔放在屏幕下方的某个地方,然后用 “面向-90度”(也就是朝上)积木让它抬起头来。这样画出来的树就能一路向上生长,有足够大的空间伸展枝丫,不会挤在屏幕中间啦!:

tree main program

6. 尝试绘制科赫雪花

前面我们说过,科赫雪花的绘制规则是:把每一条线段三等分,再在中间一段上“凸起”一个小山包。

如果一直这样分下去,线段的长度会越来越短,分叉的“层数”会越来越多。

因此,在自定义积木里,我们需要两个输入:

  • 长度(当前线段的长度)

  • 层数(还剩多少次“细分”机会)

递归的终止条件就是: 当层数 = 0 时,不再细分,直接画一条长度为“长度”的直线。

koch base case

在科赫雪花的递归中,深度决定了我们“分几次”把直线变出锯齿,长度决定了当前线段有多长

为什么深度每次要 -1?

想象你在玩“剥洋葱”游戏: 每剥掉一层,洋葱就小一圈,剩下的层数也少一层。 画科赫雪花也一样:每画一层(做一次“三等分→凸起”), 剩下的“细分次数”就少一次。 所以下一次调用时,深度 = 深度 - 1。 当深度变成 0,就说明“剥完了”,不用再细分,直接画直线就好啦!

为什么长度每次要除以 3?

还记得吗?科赫雪花的魔法是: 把 1 条线段 变成 4 条小线段,每条小线段的长度只有原来的 1/3。 就像一根 30 厘米的吸管,你把它剪成 3 等份,中间那段拱起来,就变成了 4 段 10 厘米的小吸管。 所以下一次递归时,每一小段的长度就是 长度 ÷ 3。 一层一层这样除下去,线段越来越短,锯齿越来越密,雪花就越来越漂亮!详细步骤如下:

  1. 画科赫曲线(长度/3,深度-1)

  2. 左转 60°

  3. 画科赫曲线(长度/3,深度-1)

  4. 右转 120°

  5. 画科赫曲线(长度/3,深度-1)

  6. 左转 60°

  7. 画科赫曲线(长度/3,深度-1)

koch recursive case

PS:

  • 左转 60° 和右转 120° 恰好构成一个等边三角形的两个边(外角 120° 等于两次 60° 转向)。

  • 最后再左转 60° 是为了恢复海龟的原始方向,这样画下一段时不会偏。

我们已经做好的“画科赫曲线”积木,就像搭好了一片雪花的一片“小羽毛”。但别忘了,一片完整的雪花需要 3 条这样的边哦!所以,在主程序里,我们要重复调用 3 次这个积木,每画完一条边,就让小海龟右转 120°,换一个方向画下一条边。三条边首尾相连,一朵漂亮的科赫雪花就绽放在屏幕上了:

koch main program

以上所有的代码参考示例:

参考代码——分形图案

CC-BY-SA

© 来自 CoCube 2024-2026.

This work is licensed under a CC-BY-SA 4.0 license.