递归思想是一个自然界运行法则。古印度神话故事中,在大梵天创造世界的时候,为了考验人类,做了三根金刚石柱子,在其中一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天便命令教徒把圆盘按大小顺序重新摆放在另一根柱子上,但他还规定了一个规则:在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。大梵天对教徒们预言:当你们完成移动的那一刻,就是这个世界终结的时候。
1883年,法国数学家Édouard Lucas有一次碰巧听到这个故事,无聊中的Lucas开始思考怎么玩,然而Lucas发现移动64层圆盘的过程非常繁杂,脑袋根本无法承载这么大的计算量,便尝试将问题进行简化:把6个圆盘从一个柱子移动到另外一个柱子,最少需要多少步可以完成?Lucas也给这个问题取名为汉诺塔问题。
其实对于汉诺塔问题,大家都应该很熟悉。
不过为了计算更简便些,我们先尝试汉诺塔问题只有3个圆盘的情况下应该怎么做?这个估计大家在第一时间应该能够反应出来,最后发现只需7步就可以完成。当圆盘数量增加6个以后,这个时候可能就开始有点懵了:6个圆盘的汉诺塔解法。可以发现,随着圆盘数的增加,汉诺塔问题难度越来越大。
不过人类最不怕的就是解决问题,针对汉诺塔问题,数学家们提出一个非常巧妙解法,递归解法:Step 1:将A柱子上的n-1个圆盘搬到B柱子上;Step 2:将A柱子上剩下的大圆盘搬到C柱子上;Step 3:将B柱子上的n-1个圆盘搬到C柱子上。递归解法的关键步骤:移动最大的圆盘到目的地。
递归思想在现代也成为了一款颇受欢迎的益智游戏,在娱乐过程中给人们传递着蕴含其中的递归思想。
20世纪50年代,在计算机诞生以后,Fortran是最早得到广的编程语言,Fortran源自于公式翻译的缩写。Fortran是一个为计算而生的语言,但它的编译系统并未科学地解决一些主要的难题,其中一个就是程序不能调用自身。1960年,荷兰计算机学家,艾兹格·W·迪杰斯拉克在他的著作《递归编程》中首次明确描述可以在程序当中使用递归这个概念。
递归(Recursion),是指在函数的定义中调用函数自身的方法。在数学与计算机科学中有非常重要的地位,也是众多公式与算法思想的源泉。首先,最直观体现递归概念的公式是阶乘。n的阶乘,定义为1到n所有数的乘积。假设n的阶乘结果为F(n),我们可以将阶乘定义成下面这个式子:其中F(1) = 1。可以发现,n的阶乘可以用n-1的阶乘来进行定义,用自己的定义来定义自己,这就是递归的思想。
分而治之是计算机领域一个重要思想,重复递归手段解决问题。分而治之思想要求,想办法将一个复杂的问题分解为多个子问题,直至这些问题可以被直接解决。所有子问题的计算结果综合起来就是原问题的计算结果。简单来说,分而治之思想就是递归思想的延伸。相当多的算法都有分而治之思想的影子。比如,排序算法当中著名的归并排序,就是利用了分而治之的策略。
分形是波兰数学家本华·曼德博于1975年创造出来的一个词,其原意就是指不规则、破碎等,曼德博想用这个词来描述自然界中传统欧几里德几何学所不能描述的一大类复杂无规的几何对象。这些几何对象具有自相似的性质,即它们可以分成数个部分,而每一部分都是整体缩小后的形状,就像上图的无限雪花那样。Koch曲线具备这样的自相似特征,那么Koch曲线是怎样画出来的呢?
首先画一个线段,然后把它平分成三段,去掉中间那段并用两条等长的线段代替。这样,原来的一条线段就变成了四条小的线段。用相同的方法把每一条小的线段的中间三分之一替换为等边三角形的两边,得到了16条更小的线段。然后继续对16条线段进行相同的操作,并无限地进行下去。
我们也可以把这个过程写成一个递推式,假设第n次迭代的图形是F(n),那么:其中G表示将图形的所有线段进行Koch处理,F(1)表示最开始的那条线段。可以看出Koch曲线实际上由自己来定义,是一个简单的递归过程。
自然界当中存在大量的分形结构,比如树枝、海岸线、山峰、闪电、贝壳、雪花、云朵等等,形成分形的原因非常多。但我觉得有一个非常重要的原因,那就是分形的诞生源自递归,比如树枝的不断地进行同样的生长过程、海岸线不断地受到类似的海浪碰撞、山峰不断地受到类似的风雨侵蚀,这些造就了形状上的分形结构。自然界就是这样的大环境,提供一个不受到干扰的自然演化场景,演化出了这些如此美妙的结构。