我们这个时代最荒诞的现象之一,就是某个领域的流行足以彻底扭曲一个词的本义:
- 就像“内卷”原本是人类学术语,如今却被简化成加班的代名词;
- “赋能”本是社会学概念,现在几乎成了PPT里的万金油。
- 而“递归”这个词的命运,比它们更加悲惨——它不仅被窄化,还被彻底重构,甚至被赋予了错误的定义。
最讽刺的是,当你在谷歌搜索“递归”时,它会提示你“你是不是要找:递归”,点进去又回到原页面,仿佛在玩一个自指的游戏。但抱歉,那不是递归,那只是一次循环跳转,一个前端的小把戏,连基本的函数调用都没有,更别说自我调用了。
真正的递归从来不是编程的专属发明。
早在14世纪,意大利画家乔托就在《斯特凡内斯基三联画》中完成了惊人的递归表达:画中的红衣主教跪在圣彼得面前,手中献上的,正是这幅画本身。也就是说,你在看一幅画,而画中人正在向神明献上你正在看的这幅画。
这是一种视觉上的自我包含,一种图像层级中的自反结构。这不是简单的嵌套,也不是层层包裹的俄罗斯套娃,而是意义的回环——你看到的内容,反过来又构成了你所见的一部分。
这种结构在数学中叫自相似,在语言中叫自指,在哲学中叫悖论,在艺术中则是一种深邃的元表达。
很多人把电影《盗梦空间》当作递归的经典案例,但这其实是个美丽的误会。影片里确实有梦中梦、梦中梦中梦,但这只是嵌套,不是递归。嵌套强调的是层级的堆叠,而递归强调的是过程的自我复制与结构的自指。
你可以有一百层梦境,但如果每一层都不引用前一层的逻辑或形式,那就只是深度,不是递归。
真正的递归必须包含对自身的调用,就像函数调用自己那样,但这个“调用”不一定要出现在代码里。
这里引入内容Content与Context的概念才能很好辨识这种区别:
什么是上下文(Context)嵌套?
- context 嵌套意味着:外层的规则、语义、逻辑,会在内层继续生效或被引用。
- 举例:
- 语言:我知道(你讨厌我) → “讨厌我”的语义被带入“知道”的语境。
- 程序:递归函数调用时,每一层上下文(参数、变量)被压入栈,层层依赖。
- 艺术:巴赫的主题进入新声部时,旋律被保留,但在新的语境下变形。
《盗梦空间》电影中的“梦境层级”是 依赖链:要进入二层梦,必须通过一层梦;要进入三层梦,必须通过二层梦。但每一层的规则 并没有继承或复制上一层的规则。它们的物理逻辑、场景规则完全不同,只是彼此连接。虽然每一层梦也是一个场景Context,但是三层梦只是Context的台阶,而是Context嵌套。
两面相对的镜子才是最直观的递归范例:你站在中间,看到无数个自己依次缩小,每一个影像都建立在前一个的基础上,形成一条无限延伸的视觉链条。每一帧画面都包含了上一帧的反射,而上一帧又包含了再上一帧,如此往复。这不是简单的重复,而是带有累积性的自我再现,这是一种Context嵌套。
两者对比图:
这张图左边表现了《盗梦空间》的“梦境台阶”(嵌套),右边表现了镜子反射的“无限长廊”(递归)。
- 左边:每一层梦境是独立的场景,没有继承上一层的规则,只是依赖链。
- 右边:每一层影像都包含上一层,语境被层层保留和再现,这才是递归的 Context 嵌套。
计算机科学视角:函数调用与上下文栈
编程中的递归确实借用了这一思想,但它只是递归的一种应用形式,而非定义本身。
当我们写一个计算阶乘的函数,让它自己调用自己直到n等于0,我们是在模拟一种递归过程。
在程序里,递归函数调用时会生成一个 调用栈(call stack),这是一种我们平时忽视的Context上下文,因为我们注意力都在函数调用函数自己这个内容上。
每次进入函数,就会新建一个上下文stack,保存局部变量、参数和返回点。
factorial(3) = 3 * factorial(2)
factorial(2) = 2 * factorial(1)
factorial(1) = 1
执行过程中:- 调用 factorial(3) → 上下文栈 [3]
- 调用 factorial(2) → 上下文栈 [3, 2]
- 调用 factorial(1) → 上下文栈 [3, 2, 1]
这个过程的核心并不在于“函数调用自身”,而是通过上下文栈将大问题被不断还原为更小规模的同构问题:在编程中,每一次函数调用,都会在调用栈(call stack)中生成一个新的上下文(context)。这个上下文记录了当前调用的参数、本地变量、返回地址等。递归之所以成立,正是因为这些上下文可以层层压栈,把“大问题”逐步拆解为结构相同但规模更小的子问题。
递归不是单纯的“往下挖层级”,而是通过上下文的嵌套与回溯,把复杂问题拆解并重建答案。
换句话说,递归的本质是结构的自相似性与过程的可重复性,而不是语法层面的自我引用。可惜的是,如今大多数程序员甚至AI模型都把“函数自己调用自己”当成了递归的全部,完全忽略了它在逻辑、语言、建筑、音乐乃至人类思维中的广泛存在。
语言中的递归
诺姆·乔姆斯基早就指出,人类语言之所以具有无限表达能力,正是因为其语法具有递归性。
递归并不是抽象的数学概念,而是人类日常思维和文化表达的深层结构。诺姆·乔姆斯基提出的递归语法,揭示了语言能够无限延展的秘密。
比如“我知道你知道我知道你讨厌我”,这不是单纯的重复,而是认知层级的不断调用,每一层都承接上一层,像套娃一样嵌套在更大的上下文之中。语言的力量就在于这种无限生成的能力。
乔姆斯基指出,人类语言的核心是递归。
- 基本句子:我讨厌你
- 加一层 context:我知道(我讨厌你)
- 再加一层:你知道(我知道(我讨厌你))
逻辑学与认知视角:信念的嵌套
哲学和逻辑里有个经典问题叫 知识/信念归属(belief attribution)。比如:
- 张三相信 A
- 李四相信 张三相信 A
- 王五怀疑 李四相信(张三相信 A)
音乐中同样存在递归的魅力:约翰·塞巴斯蒂安·巴赫的赋格与变奏,就像语言的递归结构。一个主题反复出现,但每次又在不同声部、不同节奏里被重新组合,彼此嵌套、彼此呼应。听众感受到的不是简单的重复,而是一种层层展开的深邃秩序。
艺术与建筑也在利用递归:伊斯兰建筑中的几何花纹,往往一个小小的图案就包含了整体的缩影,再无限延伸,形成宏伟而统一的视觉美感。这种分形式的递归,让人看到部分时便能联想到整体,从而获得心灵上的震撼。
所以,递归是一种超越编程和数学的普遍模式,它是一种上下文的嵌套,是人类理解与创造的底层机制。从语言到音乐,从艺术到思想,递归让有限的元素生出无限的可能,也让我们在复杂的世界中感受到秩序与美。
总结
递归不只是解决问题的方法,它是一种看待世界的方式。
它是宇宙中自相似结构的体现,是从雪花到银河系的分形规律,是意识对自身的反思,是艺术对自身的评论。当我们把它降维成字面上“函数自己调自己”,而没有从背景Context这个角度理解,则不仅误解了一个词,更是在削弱人类思维的广度。
递归不是代码技巧,而是一种思维方式,一种存在于艺术、语言、自然与意识深处的结构性智慧。