汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,任何时候,在小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘。问应该如何操作?
假如有三根柱子:
1、过程分析:
(1)当只有两个盘子的时候(移动两次):
a--b
a--c
b--c
(2)当有三个盘子的时候:
应该考虑将最上层的两个较小的盘子先从a移动到b,然后将a上的最大的盘子(最底层)移动到c。
将最上层的盘子移到c;
中间的盘子移到b;
再将第一步的c上的盘子移动到b;
至此,最上层的两个盘子已经成功的移动到了b。
现在,需要将a柱子上的最下层的盘子移动到c柱子上。
然后再将a柱子作为辅助位,b柱子作为起点,c柱子作为终点,将b上的两个盘子移动到c即可。
......
(3)当有n个盘子的时候,需要先将c柱子作为辅助位,a为起始位,b为终点。将上面的n-1个盘子从a移动到b。
然后将最下层的盘子从a移动到c。
最后将b上面的n-1个盘子从b移动到c。
2、代码实现:
#include<stdio.h> void hanoi(int n,char A,char B,char C){//n代表 a柱子上面的盘子数量 if(n==1){ printf("%c->%c\n",A,C);//如果只有一个盘子,直接从 A 移动到 C }else{ hanoi(n-1,A,C,B);//将 n-1个盘子从 A 移动到 B printf("%c->%c\n",A,C); hanoi(n-1,B,A,C); //将 n-1个盘子从 B 移动到 C } } main(){ hanoi(3,'A','B','C') ; }
运行结果:
以a上面初始为3个盘子:
3、递归算法过程分析:
分解过程:在有三个盘子的情况下,先对函数执行分解过程,直到分解到参数为1的时候达到递归出口。
回溯过程:从参数为1开始向上回溯,参数为2的时候先执行输出语句,然后执行输出语句下面的一句,执行后又遇到递归出口(即参数为1)。
当回溯到参数为3的时候,先执行输出语句,再执行输出语句后参数为2的情况,需要再次进行分解操作,然后参数为1,到递归出口。然后对参数为2进行回溯,先执行输出语句,再执行输出语句后的函数,2减1遇到递归出口,至此,递归过程结束。