递归算法与两个经典问题:汉诺塔问题和八皇后问题

函数在其函数体里又包含对其自身的调用,称为递归。例如阶乘函数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格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。递归实现如下:


你可能感兴趣的:(C++,汉诺塔,八皇后,递归算法,NP问题)