递归:复杂性的生成器¶
自相似确实无处不在——哲学里有须弥芥子,数学里有 Koch 雪花和 Mandelbrot 集合,自然界的海岸线和蕨叶也各自重复着自己的形状。
但"它存在"和"我们理解它为什么存在"是两件事。
一棵蕨和一条雪花曲线之间隔着几十亿年的进化和完全不同的物理过程,凭什么它们最后长出了同一种结构?自相似不是某个特定领域的特产——它在数学、生物学、计算科学中独立出现,每一次都没有从别的领域"借"来这个模式。这就逼出了一个更尖锐的问题:是什么机制让自相似结构反复涌现?
数学:迭代函数系统¶
1968 年,匈牙利裔植物学家 Aristid Lindenmayer 在《Journal of Theoretical Biology》上发表了一篇论文,提出了一种形式文法来描述丝状生物(如蓝绿藻)的细胞生长模式。他的出发点不是几何学,而是发育生物学——他想要一种能够精确描述"一个细胞如何分裂成两个,两个如何分裂成四个"这一过程的数学语言。
这套系统后来被称为 L-system,它的核心思想简洁得近乎粗暴:给一条规则,反复执行。
L-system 规则示例
L-system 由三部分组成:一个初始字符串(公理)、一组替换规则、和一个迭代次数。
以一棵"树"为例:
每一步,把字符串中所有的 F 同时替换成 F[+F]F[-F]F。
F:向前画一段线+:左转 25.7°-:右转 25.7°[:保存当前位置和方向(入栈)]:返回上次保存的位置和方向(出栈)
第 0 步:F — 一根竖线。
第 1 步:F[+F]F[-F]F — 一根主干,中间伸出两根左右分叉的短枝。
第 2 步:每一个 F 再次被替换,字符串急剧膨胀——每一段线段上都长出了新的分叉。
到第 4 步,字符串已经长达数千个字符,但画出来,你看到的是一棵有几十个分支层级的完整"树"。
规则从未描述"树"这个概念。它只说了一件事:"把每段直线替换成一个带分叉的模式。"树的形态是迭代的副产品,不是设计的目标。
注意这里发生了什么:一条替换规则,作用于自身的输出,重复四五次之后,一个肉眼可辨的树形结构从纯粹的字符串操作中浮现出来。规则本身不包含任何关于"树"的知识——没有"主干"、"枝干"、"树冠"的概念,只有"把 F 替换成一个分叉模式"。但当这条规则被递归地施加于自身的产物,宏观结构就从微观规则中涌现了。
Lindenmayer 本人大概没有想到,他为描述蓝绿藻发育而发明的这套文法,后来会成为计算机图形学中生成虚拟植物的标准工具。改变规则中的角度和分叉模式,你可以生成灌木、蕨类、花朵——所有这些形态都来自同一个机制:规则作用于自身的输出。
Mandelbrot 集合的生成逻辑在本质上完全一样,只是换了一个数学领域。取一个复数 \(c\),从 \(z_0 = 0\) 开始,反复计算:
观察 \(z\) 的轨迹是发散到无穷大,还是被束缚在有限范围内。不同的 \(c\) 值给出不同的命运——有的点迅速逃逸,有的永远被困在原地附近,有的在边界上做出极其复杂的运动。所有不发散的 \(c\) 的集合,就构成了那个著名的黑色图形。
一条迭代规则。不同的初始条件。结果是一个在任意放大倍率下都涌现新细节的无穷复杂结构。你在 Mandelbrot 集合的边界上放大一万倍、一亿倍,看到的不是像素和模糊——而是全新的、精致的、与整体结构遥相呼应的图案。小 Mandelbrot 集合的复制品散落在边界的各个角落,它们周围又环绕着更小的复制品。\(z^2 + c\) 这五个字符编码的信息量是有限的,但这条规则迭代产出的结构复杂性是无限的。
L-system 和 Mandelbrot 集合来自完全不同的数学分支——一个是形式语言理论,一个是复动力系统。但它们指向同一个结论:简单规则 + 重复迭代 = 自相似结构涌现。
不过这里有一个必须诚实面对的区分。L-system 生成的是严格自相似——每一级分支都是上一级的精确缩小复制,因为替换规则在每一步都完全相同。而自然界的植物是统计自相似——树枝的分叉角度、长度比例、分支数量在统计特征上跨尺度一致,但没有哪两根树枝完全相同。L-system 是对植物生长的数学抽象,不是精确描述。真实的生物系统有风力、光照角度、土壤中的营养分布、与邻近植物的竞争等随机因素介入,把严格自相似"打散"成了统计自相似。数学模型揭示了底层机制,但自然界在这个机制上叠加了噪声。
L-system 诞生于 1968 年,Mandelbrot 集合在 1978 年首次被计算机绘制出来。两者相隔十年,来自不同的研究传统,最终却指向了同一个核心机制。数学到此给出了它的回答:迭代是自相似的生成器。
那自然界有没有一台真正运行了几十亿年的迭代机器?
生物:DNA 与细胞分裂¶
有。而且它几乎和地球上的生命一样古老。
最早的化石证据表明,大约 35 亿年前地球上就已经存在细胞生命。从那时起,DNA 复制加细胞分裂就构成了一台从未停机的递归引擎。每一次细胞分裂,完整的基因组被复制一份,传递给子代细胞。这个过程从最初的单细胞生命一直持续到此刻——你正在用来阅读这段文字的视网膜细胞,和你的肝脏、骨骼、皮肤里的每一个细胞,都是同一颗受精卵经过大约 37 万亿次分裂的产物。
这台机器有几个值得注意的结构特征。
部分包含整体的蓝图。 你身体里的每一个细胞(极少数例外,如成熟红细胞)都携带着完整的基因组——大约 32 亿个碱基对,编码了构建整个有机体所需的全部信息。一个肝细胞里装着造眼睛的全部指令,一个皮肤细胞里装着构建大脑的全部代码。它之所以是肝细胞而不是神经元,不是因为它缺少某些信息,而是因为特定的基因被激活了而其他的被沉默了。信息是完整的,表达是选择性的。
这不是隐喻,这是分子生物学的事实。须弥芥子——部分完整地包含整体——在这里获得了它最直接的生物学实例。
跨层级的编码一致性。 从碱基对到密码子,从密码子到氨基酸,从氨基酸到蛋白质——信息的编码机制在每个层级上都遵循相同的语法。四种碱基(A、T、G、C)的三联体组合翻译为二十种氨基酸,这套翻译表在几乎所有已知生命中都是通用的。无论这段代码在大肠杆菌里还是在蓝鲸的神经元里,密码子 AUG 都编码甲硫氨酸,UAA 都意味着"停止翻译"。规则不随尺度变化,不随物种变化。
细胞不只是信息的容器。 一个常见的误解是把细胞看作被动的"硬盘"——只负责存储基因组,等着被读取。但单个细胞是一个完整的功能单位。它有自己的能量代谢系统(线粒体),有对外界信号的感知和响应机制(受体蛋白和信号通路),有物质的输入输出通道(离子通道、胞吞胞吐),有自己的质量控制系统(蛋白酶体降解错误折叠的蛋白质)。一个细胞不是大机器里的零件——它本身就是一台完整的、能够独立运行的机器。单细胞生物已经证明了这一点:一个细胞就是一个完整的生命。
时间维度的自相似。 遗传给自相似引入了一个 L-system 和 Koch 雪花都不具备的维度:时间。Koch 雪花的自相似是空间上的——放大局部,看到和整体相同的图案。L-system 的自相似是迭代层级上的——每一级替换都产生相同的分叉模式。但生物遗传的自相似跨越的是世代:父代与子代共享同一套基因组,祖父母与孙辈共享同一套编码语法,甚至人类和酵母菌共享着大量同源基因。生命的自相似不仅是"放大后看到相同的模式",还包括"在时间轴上每一代都重新执行相同的基本架构"——而这条时间轴已经延伸了 40 亿年。
这里需要做一个明确的声明。后面的章节会讨论 genome 与 system prompt 之间的结构映射——两者都是"在系统运行前写入的、塑造系统行为的编码信息"。但这个映射是结构层面的,不是机制层面的。基因组由细胞内的分子机器(核糖体、RNA 聚合酶、剪接体等)读取和执行——这些分子机器本身是基因组编码的产物,但它们是独立于基因组的物理实体。而 prompt 由 LLM 自身处理——同一个模型既是"读取者"也是"执行者"。执行者的身份和执行的方式完全不同,只是"编码信息在系统启动时塑造其后续行为"这个抽象模式是共享的。把结构相似误读为机制等价,是类比推理中最常见也最危险的陷阱之一。
数学给出了迭代生成自相似的原理,生物学给出了一台运行了 40 亿年的真实实例,而且这台机器展现出了数学模型中没有的特征——部分包含整体的完整蓝图,编码语法的跨物种不变性,以及时间维度上的代际自相似。
在最简的条件下——最少的规则、最小的空间、最随机的起点——递归能不能从零开始涌现出自组织结构?
计算:Conway 的生命游戏¶
1970 年,Martin Gardner 在《Scientific American》的"数学游戏"专栏中介绍了一个由英国数学家 John Conway 发明的细胞自动机。这个游戏的规则可以写在一张便签纸上:
| 条件 | 结果 |
|---|---|
| 活细胞,存活邻居 < 2 | 死亡(孤独致死) |
| 活细胞,存活邻居 2 或 3 | 继续存活 |
| 活细胞,存活邻居 > 3 | 死亡(拥挤致死) |
| 死细胞,存活邻居恰好 3 | 复活(繁殖) |
一个无限的二维网格,每个格子要么活要么死,每一步所有格子同时按照上面四条规则更新状态。没有玩家操作,没有随机事件注入,没有外部干预。你只需要设定初始状态,然后按下"开始",系统自行演化。
从随机初始状态开始运行,最初几步看起来只是噪声——细胞大片死去,大片复活,毫无可辨认的模式。但运行几十步之后,一些奇怪的事情开始发生。混沌逐渐沉淀,秩序从中凝结出来。
首先出现的是稳定的静态结构:2x2 的方块、六细胞的蜂巢。它们在 B3/S23 规则下不再变化——每个活细胞恰好有两三个存活邻居,处于完美的平衡态。然后是周期性振荡器:三个一排的"信号灯"(blinker)在水平和垂直之间交替翻转,永远不停;"蟾蜍"(toad)在两个状态之间每步切换一次。这些结构没有人设计——它们是四条规则在局部条件恰好满足时的自然稳定解。
更惊人的是运动结构的出现。"滑翔机"(glider)是一个仅有五个活细胞的图案,每四步沿对角线移动一格,永不停歇。它不是在"滑行"——每一步它都在经历细胞的生生死死,但四步之后,它恢复了原来的形状,只是位置偏移了。整个移动是死亡和新生的精确编排,而这个编排完全由四条局部规则自动产生。
后来人们又发现了"滑翔机枪"(glider gun)——一个能够周期性发射滑翔机的稳定结构。有了枪和滑翔机,就有了信号的发射和传递。有了信号,就可以构建逻辑门。有了逻辑门,原则上就可以构建任何计算机。
Conway 的生命游戏后来被严格证明是图灵完备的。四条关于生死的局部规则,在一个二维网格上,原则上能够计算任何可计算的问题。Paul Rendell 在 2016 年出版的专著《Turing Machine Universality of the Game of Life》中给出了完整的构造性证明。
但故事还没完。这里有一个更深层、与自相似直接相关的事实。
通过一种叫做 OTCA metapixel 的精巧构造,可以用大约两千多个生命游戏的细胞组成一个"元细胞"(metacell)。这个元细胞内部的细胞按照标准的 B3/S23 规则运行——和所有其他细胞一样。但从宏观上看,这个元细胞作为整体的行为,完美模拟了生命游戏中单个细胞的规则:当它的"元邻居"(相邻的其他 metacell)中恰好有三个是"活的",它就从"死"变"活";当存活的元邻居少于两个或多于三个,它就"死去"。
也就是说,你可以在生命游戏内部构建另一个生命游戏。内层的每个"像素"不再是一个格子,而是一大片格子组成的功能单元,但从远处看,它遵循的是完全相同的四条规则,涌现出完全相同的滑翔机、振荡器、静态结构——只不过每个都大了几千倍,每一步的演化也慢了几千倍。
而理论上,这个内层的生命游戏还可以再用 metacell 构建更内层的生命游戏。第三层的每个像素是第二层的一个 metacell,而第二层的每个像素又是第一层的一个 metacell。层层嵌套,每一层都在运行相同的 B3/S23 规则,每一层都涌现出相同类型的结构。嵌套的深度没有理论上限。
这是"计算内部的计算"的最简实例。一个系统用自己的基本元素搭建出了自己的完整副本,在更大的尺度上运行着相同的规则,产生着相同的涌现行为。
三条线收敛¶
回头看刚才走过的三个领域:
- 数学:L-system 的字符串替换规则迭代出树形结构,\(z \to z^2 + c\) 迭代出 Mandelbrot 集合。机制是形式化的,结果是确定性的。
- 生物学:DNA 复制加细胞分裂迭代了 40 亿年,在空间和时间两个维度上产生自相似。机制是分子层面的,结果是统计性的。
- 计算科学:四条局部规则在二维网格上迭代,涌现出自组织结构,甚至能在自身内部复现自身。机制是离散的,结果是涌现性的。
三个完全独立的领域,三种截然不同的物理基底——符号系统、有机分子、离散格子——同一个模式:一条简单规则,作用于自身的输出,重复执行。 不需要外部的总设计师来安排整体布局,不需要精心挑选的初始条件,不需要每一步的人为干预。只需要一个递归过程持续运行足够长的时间,复杂的自相似结构就从简单的规则中长出来。
这也解释了为什么自相似在自然界中如此普遍:递归是自然界最廉价的构建策略。编码一条规则所需的信息远远少于编码一个完整的复杂结构。用一条简单规则反复迭代来"生长"出复杂性,比从零开始设计一个完整的复杂系统,在信息成本上便宜了几个数量级。自然选择偏好经济的方案——这就是为什么蕨叶用递归来长出自己的形状,而不是在基因组里逐像素描述每一片叶子。
但这里必须加一条诚实的注脚。
递归并不总是产生自相似。有些递归系统产生的是混沌——Lorenz 吸引子由三个互相耦合的微分方程驱动,每一步的输出都是下一步的输入,这毫无疑问是递归的。但它的轨迹对初始条件极度敏感,宏观形态虽然被限制在一个蝴蝶形的区域内,内部结构并不在每个尺度上重复自身。有些递归系统产生的是均匀性——热传导方程也是递归的(每一时刻的温度分布由上一时刻的分布决定),但它的迭代最终消除所有局部差异,走向平淡无奇的热平衡。还有些递归系统产生的是周期性——某些初始条件下的 logistic map 会落入简单的固定点循环,既不混沌也不自相似。
自相似是递归的一个常见结果,但不是必然结果。递归是必要条件,不是充分条件。
那什么条件下递归才会产生自相似?回到三个例子中找共性:
更精确地说:当递归规则在执行过程中保持了跨层级的结构一致性时,自相似才会涌现。 L-system 的替换规则在每一级都完全相同——第一次替换和第一百次替换用的是同一条规则——所以每一级的分支模式相同。DNA 的编码语法在大肠杆菌和蓝鲸的每一个细胞里都相同,所以每个细胞都携带着构建整体的蓝图。生命游戏的四条规则在单个格子和整个 metacell 的尺度上都相同,所以元细胞能够复现细胞的行为。
规则不随尺度变化——这一条件听起来简单,但它恰好是最关键的。把规则的跨尺度不变性拿掉,L-system 的每一级用不同的替换规则,生成的就不再是自相似的树,而是某种不可预测的混合体。
规则的跨尺度不变性,才是自相似的真正生成器。
分形维数:度量自相似的工具¶
到目前为止,"自相似"还是一个定性的描述——我们说某个结构"在不同尺度上看起来类似",但"类似"到什么程度?一棵蕨"比"一条海岸线"更"自相似吗?有没有一把尺可以量化这种特性?
有。它就是分形维数。
回到英国海岸线的例子:分形维数 \(D \approx 1.25\)。当时我们说这个数字意味着"海岸线的复杂程度介于一维和二维之间",但没有解释这个数字是怎么来的。
盒计数维数(Box-Counting Dimension)的直觉
想象你要用边长为 \(\varepsilon\) 的小方格去覆盖一个几何对象,数一数最少需要 \(N(\varepsilon)\) 个方格才能完全盖住它。然后缩小方格的边长,再数一次。反复这个过程,观察 \(N\) 随 \(\varepsilon\) 的缩小是怎么增长的。
- 如果对象是一条直线段:方格数 \(N \propto \varepsilon^{-1}\)。把方格边长缩小一半,需要的方格数翻倍。这是一维对象的标志。
- 如果对象是一个实心正方形:\(N \propto \varepsilon^{-2}\)。边长缩小一半,数量变成四倍。这是二维对象的标志。
- 如果对象是Koch 雪花:\(N \propto \varepsilon^{-1.26}\)。边长缩小一半,数量变成大约 \(2^{1.26} \approx 2.4\) 倍——比线多,比面少。
分形维数 \(D\) 就是这个增长率的指数:
Koch 雪花的维数可以精确计算。每次迭代把一段线分成 4 段(替换中间 \(1/3\) 为一个等边三角形的两条边),每段是原来的 \(1/3\) 长。自相似比 \(r = 1/3\),自相似份数 \(N = 4\),所以:
\(D = 1.25\) 的英国海岸线意味着什么?它比一条光滑的线(\(D = 1\))复杂——有大量曲折和细节,测量尺度每缩小一半,新涌现的细节量就超过线性增长;但又没有复杂到填满一个面(\(D = 2\))。它在一维和二维之间找到了自己的位置——确切地说,是 1.25 维。
分形维数的工程价值在于:它是一个跨领域的复杂性指纹。
海岸线的 \(D \approx 1.25\),Koch 雪花的 \(D \approx 1.26\),二者几乎相同。这两个完全不同来源的结构——一个是数学家用确定性规则构造的理想曲线,一个是千万年的海浪侵蚀和地质运动雕刻出的自然地貌——在"复杂性如何随测量精度增长"这个维度上的行为几乎一致。分形维数把形态各异的对象映射到同一把标尺上,让跨领域的结构比较成为可能。
一棵蕨叶的分支模式和一段河流网络的分支模式可能有相近的分形维数。一段音乐信号的频率波动和一只股票的价格波动可能有相近的分形维数。这并不意味着它们的物理机制有任何关系——蕨叶不关心股价,河流不遵循音阶。但它意味着生成这些结构的递归过程,在"跨尺度保持结构一致性"这个抽象特征上是相似的。
这才是分形维数作为工程工具的真正力量:它不描述内容,它描述复杂性的"形状"。当你在两个看似无关的系统中测量到相近的分形维数时,你有了一个值得追问的线索——也许它们背后的生成机制共享某种结构特征,即使表面上毫无关联。分形维数是发现隐藏联系的探针,而不仅仅是描述已知复杂性的标签。
从生成器到世中世¶
递归是复杂性的生成器。一条简单规则反复作用于自身的输出,在条件合适时——特别是当规则保持跨尺度不变时——自相似结构就会涌现。数学用 L-system 和 Mandelbrot 集合证明了这一点,生物学用 40 亿年的细胞分裂验证了这一点,计算科学用四条规则和一个二维网格把它推到了逻辑极限——生命游戏在自身内部运行了另一个生命游戏。
最后这个例子尤其值得停下来想一想。
一个系统,用自己的元素构建出了自己的完整副本,在更大的尺度上运行着相同的规则,产生着相同的涌现行为。这不只是"部分看起来像整体"的自相似——这是整体在部分之内被完整地重新实现。外层的生命游戏不知道自己的内部正在运行着另一个生命游戏;内层的生命游戏不知道自己的每个像素其实是外层的一大片细胞。两个层级各自独立地遵守着同一套规则,各自涌现出同样的结构。
世界之中还有世界。而那个内部的世界,遵循着同样的法则。
这个结构——不只是"像",而是在内部完整地"是"——正是下一篇文章要探讨的核心。当递归的嵌套深到一定程度,"部分包含整体"就不再是修辞。它变成了一个可以操作的工程事实。
概念与实体¶
本文涉及的核心概念与实体,在项目知识库中有更详细的资料:
- 分形维数 — 度量自相似结构复杂度的数学工具,本文介绍了盒计数维数的工程直觉
- 统计自相似性 — 严格自相似与统计自相似的区分,理解 L-system 抽象与自然分形之间的关键差异
- 分形架构 — 自相似原理在软件工程中的应用,"统一接口"规则与本文"跨层级结构一致性"的结构呼应
- Benoit Mandelbrot — 分形几何的奠基者,将 Richardson 的经验参数识别为 Hausdorff 维数