函数在其函数体里又包含对其自身的调用,称为递归。例如阶乘函数f(n)就可以用递归表示为
而其非递归表示为
可见非递归表示要复杂一些,对于更为复杂的问题,则更是如此,如以下所述的汉诺塔问题。
传说在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面。僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭。其实,如果每秒移动一块金片,移完这些金片需要5845.54亿年以上,而地球存在至今不过45亿年,太阳系的预期寿命据说也就是数百亿年。真的过了5845.54亿年,不说太阳系和银河系,至少地球上的一切生命,连同梵塔、庙宇等,都早已经灰飞烟灭。我们现在通过输入金片数m(如m=3),希望得到解决方案,三根柱子分别用A,B,C表示,其中A是原柱,C是目标柱,B是辅助柱。递归实现:
汉诺塔问题是一个NP(nondeterministic polynomial-time,非确定型多项式时间)问题。确定型机器是指,根据其某时刻执行的指令,可以确定其接下来执行的指令,而非确定型机器——这一模型——对下一步是有选择的,如果这些后面的指令中有一条通向正确的解,那么它将总是选择这一正确的步骤。NP完全问题是NP问题的一个子集,定义是,任意NP问题A的任何实例,都可以经(多项式)变换为某一NP完全问题B的一个实例,可以通过求解B然后将答案映射回原始的解答来求解A。
旅行推销员问题是一个NP(nondeterministic polynomial-time,非确定型多项式时间)完全问题,
阿德勒曼利用DNA计算解决“旅行推销员”问题——为一个在N个城市间奔忙的推销员找到一条最优路线——使之每个城市都能到,但又不能超过一次——的步骤是:
为每一个城市创建一个小号码的DNA链;
用多聚酶链式反应(PCR)对这些DNA链进行许多次复制;
把上一步复制所得的所有DNA链放入一支试管,由于DNA连接酶的作用,这些DNA链会随机组合连接为许多条长链;
利用胞质基因“消灭”那些首尾两部分不是开头和结束两个城市的链,然后运用PCR对剩下的链进行复制;
利用酶反应消除路式中包含的城市超过N的DNA链;
利用酶反应消除路式中不包含第一个城市的DNA链,然后对第二个到第N个城市重复这一操作;
此时剩下的链就是正确答案,运用PCR技术对其进行复制,运用电泳技术“解读”正确链中的DNA顺序,其结果就是各城市的正确排序。
这一思想与遗传算法是异曲同工的。所谓遗传算法(genetic algorithm)是指如下过程:
1.开始时随机生成一组字符串(或一组程序);
2.利用这些程序进行计算,筛选出其中效用最优者;
3.将效用最优者进行配对,代代“繁衍”,直到数量达到最大(maxsize);
4.返回步骤2,重复执行。
八皇后问题是指,在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。递归实现如下: