学径 LearnPath

递归与分形

1 / 1 · ← → 翻页

阅读模式

第 12 课

递归与分形:自相似如何被计算

复杂形态可以从短规则中生长。

罗马花椰菜
罗马花椰菜(Brassica oleracea)的自相似形态。Ivar Leidus。来源:Wikimedia Commons,CC BY-SA 4.0。

导言

课程目标

分形:整体像局部。

递归:函数调用自己。

停下来,并且回到原位。

现象

每一朵都像整棵的缩影

罗马花椰菜
罗马花椰菜(Brassica oleracea)的自相似形态。Ivar Leidus。来源:Wikimedia Commons,CC BY-SA 4.0。

同一条生长规则,不同的尺度。

原理

复杂来自规则的深度

篇幅短,不等于形态简单。

层数加一,枝条大约加倍。

辨析

递归不是另一种循环

循环:同一层,重复 kk 遍。

递归:新的执行,更小的同类问题。

原理

退出条件是尺度选择

n=0n = 0:此处不再生长。

没有退出条件,规则未写完。

例证

从 draw_y 到 draw_tree

python
def draw_tree(length, n):
    if n == 0:
        return
    t.forward(length)
    t.left(30)
    draw_tree(length * 0.7, n - 1)
    t.right(60)
    draw_tree(length * 0.7, n - 1)
    t.left(30)
    t.backward(length)

请打开「在线 IDE」。先跑 n=2。

例证

n = 1 就是一个 Y

两次内层调用立刻返回。

nn 增大,Y 的两臂上再长出 Y。

辨析

漏掉后退,树就断了

内层不还原,外层接到叶尖上。

错误按层数放大。

那不是画风,是模型断裂。

实践

本节练习

先朝北,调用 draw_antenna(80, 3)。

左转 45∘45^\circ,长度乘 0.6。

n == 0 返回;结束时仍朝北、停在起点。

请打开「在线 IDE」。

小结

本节要点

自相似是过程的性质。

递归必须有退出条件。

画完子树,送海龟回家。

下一课

下一课

软件工程。

模块化、分层、测试、框架与版本。

已到最后一页。可按 ← 回顾,或切换回阅读模式。