章节 · 点击跳转视频
0:00
开场:阶乘与斐波那契的递归定义
▶ 正在看
6:54
GEB 递归转移网络:语法生成句子
▶ 正在看
10:54
递归画树:分枝、深度与终止
▶ 正在看
16:04
科赫曲线与随机化的海岸线
▶ 正在看
20:10
有限面积无限周长:英国海岸线之问
▶ 正在看
26:21
谢尔宾斯基三角形与混沌游戏
▶ 正在看
32:16
递归为何必须触底:学生问答
▶ 正在看
36:43
分形蕨:迭代函数系统与坐标变换
▶ 正在看
49:06
代码不递归但映射递归:跳出系统
▶ 正在看
56:07
曼德博集合:复平面与逃逸迭代
▶ 正在看
69:28
巴赫的嵌套和声:递归结构与过程
▶ 正在看
72:49
调用栈的压入弹出与音乐迷宫
▶ 正在看
本期讲者
柯伦·凯莱赫MIT 2007 年夏季《哥德尔、埃舍尔、巴赫》研讨课的代课讲者,本讲用自己编写的 Groovy/Java 程序演示递归与分形。后成为数据可视化领域的开发者与教育者。
学生课堂上的 MIT 学生,多次提问(科赫雪花剪断比喻、海岸线是否收敛、无递归函数如何判断输出递归等),推动了讲者对递归定义的深化。
核心句型 · 9
1. What makes X Y is the fact that …
“What makes this function recursive is the fact that it calls itself”
用 the fact that 把「原因」名词化,适合下定义或点明本质特征。仿写:What makes this argument convincing is the fact that it relies on data.
2. X is defined in terms of itself
“Recursion is something which is defined in terms of itself”
in terms of 表示「用……来定义/表述」。学术写作中描述循环定义、相对关系时常用。仿写:Success here is defined in terms of user retention.
3. You could imagine if you were to …, …
“You could imagine if you were to continue this infinitely”
were to 虚拟语气引出假想情境,语气比 if you continue 更客气、更思辨。适合引导听众做思想实验。
4. The more you …, the longer/more … gets
“The more that you zoom in on the coast of Britain, the longer the perimeter gets”
双重比较级表示正相关关系。注意口语中可加 that;书面省略。仿写:The more precisely you measure, the longer it gets.
5. Let's hold off on that until after we …
“Let's hold off on that answer until after we do the next one”
hold off on 表示暂缓。讲课或汇报时把问题悬置到后面再答的地道说法,比 wait 更自然。
6. X per se is not there, but the result of X is
“Recursion per se is not there, but the result of a recursion”
per se 强调「就其本身而言」,用于区分「事物本身」与「事物的效果/表现」。适合做概念辨析。
7. This is the distinction between A and B
“This is the distinction between recursive processes and recursive structures”
点明两个概念的区别,常在给出例子后总结用。后接对 A、B 各自的定义句。
8. It takes a really … to …
“It takes a really fine musical ear to hear this”
it takes + 名词 + to do 表示「做某事需要某种能力/条件」。仿写:It takes a trained eye to spot the difference.
9. in order to do anything, X has to …
“All recursive functions in order to do anything have to bottom out at some point”
用「要想有任何结果」强调必要条件,语气比 must 更带论证味。仿写:In order to be useful, a model has to generalize.
生词精讲 · 92 · 按出现顺序
recursion
/rɪˈkɜːrʒən/
n.
0:00
递归;自我调用或自我指涉的过程
fractals
/ˈfræktəlz/
n.
0:00
分形(局部与整体自相似的几何图形)
fill in
phr.
0:00
代班,临时顶替
self-similar
/ˌselfˈsɪmələr/
adj.
0:40
自相似的,各尺度下形态相同的
factorial
/fækˈtɔːriəl/
n.
0:40
阶乘
argument
/ˈɑːrɡjəmənt/
n.
2:40
(函数的)参数、实参
transition networks
n. phr.
6:54
转移网络(由节点和有向边构成的语法图)
grammar
/ˈɡræmər/
n.
6:54
(形式)语法,生成规则系统
essence
/ˈesns/
n.
6:54
本质,精髓
loops back out on itself
phr.
7:50
绕回到自身,形成环路
curly braces
n. phr.
8:32
花括号 { }
preposition
/ˌprepəˈzɪʃn/
n.
9:29
介词
relative pronoun
n. phr.
9:29
关系代词(who, which, that 等)
correspond to
phr.
9:29
与……对应
nest
/nest/
v.
10:10
嵌套,把一层结构放入另一层之内
pseudo code
/ˈsuːdoʊ koʊd/
n.
11:41
伪代码,用自然语言写的算法草稿
entry point
n. phr.
12:04
(程序的)入口点
initiates
/ɪˈnɪʃieɪts/
v.
12:04
启动,发起
branch out
phr.
13:16
分枝,向外扩展
scale
/skeɪl/
v.
14:09
按比例缩放
zoomed in on
phr.
16:04
放大观察(zoom in on sth)
equilateral triangle
/ˌiːkwɪˈlætərəl ˈtraɪæŋɡl/
n. phr.
16:50
等边三角形
segments
/ˈseɡmənts/
n.
16:50
线段,分段
execution
/ˌeksɪˈkjuːʃn/
n.
17:35
(程序或规则的)执行
generalize
/ˈdʒenrəlaɪz/
v.
19:25
推广,一般化
randomization
/ˌrændəmaɪˈzeɪʃn/
n.
20:10
随机化
coastlines
/ˈkoʊstlaɪnz/
n.
20:10
海岸线
extrapolated
/ɪkˈstræpəleɪtɪd/
v.
21:04
外推,由已知推断未知
perimeter
/pəˈrɪmɪtər/
n.
21:04
周长
finite
/ˈfaɪnaɪt/
adj.
21:04
有限的(反义 infinite)
mind-boggling
/ˈmaɪnd ˌbɑːɡlɪŋ/
adj.
21:40
令人难以置信的,难以想象的
iterations
/ˌɪtəˈreɪʃnz/
n.
21:40
迭代,重复执行的次数
satellite image
n. phr.
24:06
卫星图像
refine
/rɪˈfaɪn/
v.
24:39
细化,使更精确
theoretical creation
n. phr.
25:44
理论构造物
resembles
/rɪˈzemblz/
v.
26:21
与……相似
iterated function system
n. phr.
27:22
迭代函数系统(IFS),由多个收缩映射反复作用生成分形
chaos game
n. phr.
28:08
混沌游戏(随机向顶点移动一半距离的分形生成法)
plot
/plɑːt/
v.
28:48
绘制(点或曲线)
fern
/fɜːrn/
n.
30:08
蕨类植物
hold off on
phr.
32:16
推迟,暂缓(做某事)
bottom out
phr.
34:11
触底;(递归)到达终止条件
manifestation
/ˌmænɪfeˈsteɪʃn/
n.
34:51
显现,具体表现
well put
phr.
36:08
说得好,表述精当
coordinate transformation
n. phr.
37:26
坐标变换
outer
/ˈaʊtər/
adj.
39:14
外层的,外部的
correspond
/ˌkɔːrəˈspɑːnd/
v.
44:52
对应,相当
probabilities
/ˌprɑːbəˈbɪlətiz/
n.
48:25
概率
sparse
/spɑːrs/
adj.
48:25
稀疏的
spiraling
/ˈspaɪrəlɪŋ/
v.
49:06
盘旋,呈螺旋状运动
repetitive
/rɪˈpetətɪv/
adj.
50:46
重复性的
extrapolating
/ɪkˈstræpəleɪtɪŋ/
v.
52:38
外推,推演
stepping out of the system
phr.
52:38
跳出系统(GEB 术语:从更高层次审视系统)
abstract from
phr.
53:15
从……中抽象出来,忽略细节
perceive
/pərˈsiːv/
v.
53:15
感知,觉察
complex plane
n. phr.
56:07
复平面
mathy
/ˈmæθi/
adj.
56:07
(口语)数学味浓的,偏数学的
imaginary
/ɪˈmædʒɪneri/
adj.
56:55
虚(数)的
square root
n. phr.
56:55
平方根
linear
/ˈlɪniər/
adj.
58:16
线性的
components
/kəmˈpoʊnənts/
n.
59:09
分量,组成部分
applet
/ˈæplət/
n.
59:53
小应用程序(尤指嵌入网页的 Java 程序)
origin
/ˈɔːrɪdʒɪn/
n.
60:39
(坐标)原点
render
/ˈrendər/
v.
60:39
渲染,绘制成图像
radius
/ˈreɪdiəs/
n.
61:28
半径
escaped
/ɪˈskeɪpt/
v.
61:28
逃逸(此处指迭代点跑出边界圆)
approximation
/əˌprɑːksɪˈmeɪʃn/
n.
62:10
近似
assign
/əˈsaɪn/
v.
62:10
分配,指定
nub
/nʌb/
n.
64:22
小突起,小疙瘩
reframed
/ˌriːˈfreɪmd/
v.
65:31
重新框定,重新设定为
recurses
/rɪˈkɜːrsɪz/
v.
66:20
递归调用
integer
/ˈɪntɪdʒər/
n.
67:56
整数
overloaded
/ˌoʊvərˈloʊdɪd/
v.
68:39
(编程)重载(为运算符定义新含义)
increment
/ˈɪŋkrəmənt/
v.
68:39
递增,加一
blow you away
phr.
68:39
让你大为震撼
harmonic
/hɑːrˈmɑːnɪk/
adj.
69:28
和声的
labyrinth
/ˈlæbərɪnθ/
n.
69:28
迷宫
chord progressions
n. phr.
70:10
和弦进行
keys
/kiːz/
n.
70:10
(音乐)调,调性
embeds
/ɪmˈbedz/
v.
70:10
嵌入
modeled after
phr.
70:10
以……为原型仿制
restates
/ˌriːˈsteɪts/
v.
70:57
重述,再次陈述(音乐主题)
per se
/ˌpɜːr ˈseɪ/
adv.
71:41
本身,就其本身而言(拉丁语)
distinction
/dɪˈstɪŋkʃn/
n.
71:41
区别,区分
fine musical ear
n. phr.
72:15
敏锐的音乐听觉
pushing and popping
phr.
72:49
(栈的)压入与弹出
call stack
n. phr.
72:49
调用栈
retain
/rɪˈteɪn/
v.
74:05
保留,记住
reflects
/rɪˈflekts/
v.
75:26
映照,反映
理解自测 · 11 题 · 是真懂了,还是以为自己懂
1. 讲者一开始给递归函数下的定义是什么?用阶乘举例说明。
讲者的初始定义是「递归函数就是调用自身的函数」。以阶乘为例,n! 被定义为 n × (n−1)!,程序中 factorial(n) 内部调用 factorial(n−1),当 n 大于 1 时不断向下调用,直到 n 等于 1 返回 1,再逐层相乘得到结果。这一定义出现在开场的阶乘与斐波那契部分,是全讲的出发点;后面讲者会用谢尔宾斯基三角形和蕨类的例子修正它。
2. 科赫曲线的生成规则是什么?程序 create curve 为什么要调用自己四次?
规则是把一条线段三等分,在中段上向外做一个等边三角形,并去掉原来的中段,于是一条线段变成四条较短线段。程序 create curve 调用自身四次,正是因为每次应用规则后产生四段,每一段都要再次应用同样的规则。讲者在科赫曲线一节中把代码里四个函数调用与图上的四段一一对应,说明程序结构直接映射几何规则。
3. 分形蕨的四个映射分别对应什么,概率各是多少?
四个映射分别对应:映射到茎(概率 0.01)、映射到左分枝(0.07)、映射到右分枝(0.07)、向上盘旋的主体映射(0.85)。讲者在蕨类一节解释,这些概率只影响点的分布密度和图像饱满度,不改变最终形状;他试过等概率,结果上部极其稀疏,「看起来很不好」。这正是 Barnsley 蕨的标准参数。
4. 为什么讲者说所有递归函数都必须「触底」(bottom out)?
因为递归函数每次都调用自身,如果没有终止条件(如 n ≤ 1 时返回 1,或 depth 为 0 时停止),它会无限调用下去,永远返回不了结果。在学生提问环节,讲者以去掉判断条件的 Fibonacci 为例说明会无限循环。他同时指出自然界的递归(如树的分枝)也会在枝条达到某个尺寸时转为生叶而停止,只有理论世界(如 GEB 里精灵问元精灵的对话)才能设想不触底的递归。
5. 科赫雪花为什么面积有限而周长无限?讲者如何回应学生「碎片越来越小应该收敛」的疑问?
每次应用规则周长都变为原来的 4/3,无限次后周长发散到无穷;而面积增量越来越小且总和收敛,整个图形始终装在一个有限的框内。学生质疑新增的碎片越来越小、总长应该收敛,讲者的回答是:对分形而言,每层新增的长度并不趋于零,所以总和不断变大,「越精确越长」。他借英国海岸线的例子说明这是同一现象:测量尺度越小,海岸线越长,因此从来没人能定出确切数值。
6. 谢尔宾斯基三角形的混沌游戏是随机的,为什么每次生成的图像都一样?
因为三个「向顶点移动一半距离」的映射构成一个迭代函数系统,它们有唯一的吸引子——谢尔宾斯基三角形。无论初始点在哪、随机序列如何,点经过多次映射后都会落在吸引子上并逐渐填满它。讲者在回答学生「重新运行会不会不同」时明确说答案是「会生成同样的图」,并在蕨类例子之后进一步解释:每个映射把整体缩到局部,整体又包含所有局部,所以结构被无限复制,与具体随机路径无关。
7. 讲者说「代码本身不递归,但映射是递归的」,这句话如何改变了递归的定义?
它把递归从「函数调用自身」这一代码层面的特征,扩展为「结构把整体映射到自身的一部分」这一更抽象的属性。谢尔宾斯基三角形和蕨类的程序只是 while true 循环加随机选择,没有任何自调用,但三角形被映射到自身的三个子三角形、蕨叶被映射到自身的分枝上,这种「映射到自身」才是递归所在。这一转折为后面讨论英语和音乐做铺垫:它们是递归结构,未必由递归过程直接生成。
8. 在问答中,学生问「没有递归函数时如何不运行代码就判断输出是递归的」,讲者的回答与 GEB 的哪个概念相连?
讲者的回答是必须「跳出系统」:不能只在代码内部按步骤执行(那就是当一台计算机),而要从更高层次抽象地思考这些映射整体上在做什么,才能预见输出会是递归结构。这直接对应 GEB 中「跳出系统」(jumping out of the system)的概念。讲者进一步断言,没有严格的机械测试能判定一个程序会否产生递归输出,「目前只有人类能做到」,这与程序高层性质不可判定的思想相通。
9. 曼德博集合的渲染算法为何只在 −2 到 2 的范围内计算,并且用「逃逸迭代次数」上色?
数学上可证明,一旦迭代点的模超过 2,后续必然发散到无穷,所以半径 2 的圆是判定逃逸的边界,有趣的结构也只出现在这个范围内。算法对每个像素取 C,从 Z=0 开始反复计算 Z=Z²+C,记录跑出圆所需的迭代次数并据此上色;若达到最大迭代次数仍未逃逸,就假定它永不逃逸并涂黑。讲者强调这是近似:真正的集合只有黑色部分,彩色只是为了好看,而最大迭代次数是不得已的阈值。
10. 如果有人反驳「分形只是数学游戏,与现实无关」,讲者会如何回应?
讲者在课堂上已经预先回应了这一点。他承认数学上的科赫曲线是理论构造,宇宙中不存在真正无限精细的东西(地球空间有限)。但他同时指出自然界「相当接近」它:随机化的科赫规则生成的曲线与真实海岸线几乎一样,推广到三维就是逼真的山脉;树的分枝是一种运行中的递归程序;英国海岸线的长度随测量尺度增长且无法定值。因此他的立场是:分形是理想模型,其价值在于揭示自然结构在很宽尺度范围内的自相似规律,而非声称自然是无限的。
11. 讲者把调用栈与巴赫音乐的嵌套转调类比。这一类比放到日常任务规划中是否成立?
成立,而且讲者和学生在课堂末尾已经把它推广到了目标层面。调用栈的逻辑是:进入子任务前把当前位置压入栈,完成后弹出并回到原处;巴赫的《小和声迷宫》从主调进入某调、再进入更远的调,然后逐层返回,结构相同。学生提出「有目标时也是这样」,讲者认同:高层目标需要子目标,子目标又需要子子目标,这就是编程困难的根源。类比的限度在于:栈要求严格的后进先出,而人类的目标追求常常并行、中途放弃或忘记返回——这正是 GEB 所说的「层数太深会忘了自己在哪」。