首页 > 代码库 > 汉诺塔的简单递归思想

汉诺塔的简单递归思想

最近在校招打酱油,闲得没事想起了大一学过的汉诺塔,不过那时只知道玩游戏,一次性3~7个玩过了,还是有成就感的呵呵。游戏链接:http://www.7k7k.com/swf/335.htm。

 

看了网上很多递归方法,像

 1 #include<stdio.h>   2     3 void move(int n,char a,char b,char c)   4 {   5     if(n==1)   6         printf("\t%c->%c\n",a,c);       7     else   8     {   9         move(n-1,a,c,b);              10         printf("\t%c->%c\n",a,c);  11         move(n-1,b,a,c);              12     }  13 }  14    15 main()  16 {  17     int n;  18     printf("please input the number:");  19     scanf("%d",&n);  20     move(n,a,b,c);  21 }

是最多的,如果觉得难以理解,就看看我下午自己搞的递归吧。

 

代码不需要全部贴出来,只贴重要的。

 

1 char string1[6] = "left";  2 char string2[6] = "mid";  3 char string3[6] = "right"; 4 int i = 1;

先定义3个字符串和整数i,用于后面的显示。

 

1 void exchangeSTR(char string1[],char string2[]) {  2     char x[6];  3     strcpy(x,string1);  4     strcpy(string1,string2);  5     strcpy(string2,x);  6 } 

字符串交换函数,用于两个字符串的交换。

 

1 void wtw(char string1[],char string2[]) {  2     cout << i++ << . <<   << string1 << " -> " << string2 << endl << endl;  3 }

定义打印语句格式。

 

1 void RootOfMove(char string1[],char string2[],char string3[]) {  2     wtw(string1,string2);  3     wtw(string1,string3);  4     wtw(string2,string3);  5 }

此功能函数的作用是:打印出当块数为2时的具体步骤,这是递归产生的基本条件。

 

 1 void TowerOfHanoi(int n) {   2     if (n == 1) {   3         wtw(string1,string3);   4     }else if (n == 2) {   5         RootOfMove(string1,string2,string3);   6     }else {   7         exchangeSTR(string2,string3);   8         TowerOfHanoi(n-1);   9         exchangeSTR(string2,string3);  10         wtw(string1,string3);  11         exchangeSTR(string1,string2);  12         TowerOfHanoi(n-1);  13         exchangeSTR(string1,string2);  14     }  15 }

这是核心函数,将在main函数中调用。

当n为1时,按照wtw函数打印出左至右的步骤;

当n为2时,按照RootOfMove函数打印出相应的步骤;

当n为3时,(无论n是多少,请视作2部分,最下面的一个和它上面的n-1个,因此,步骤也视为RootOfMove中的3步)

1、交换string2和string3的值,也就是交换"mid"和"right",再执行,为什么呢?因为当n为2时,执行TowerOfHanoi(2)函数后,所有的木块都到了右边,以此为参照,我们先无视最下面那一块,操作上面2块,只不过不是把他们移到右边,而是中间!这个操作和TowerOfHanoi(2)很类似,只需要把TowerOfHanoi(2)右边和中间有关的操作互换就能实现!所以在交换后,再执行TowerOfHanoi(2)就可以把上面2块移到中间。(该步骤相当于RootOfMove中的wtw(string1,string2))

2、把最下面的1块移到右边,由于之前string3的值换了,所以要和string2换回来。(该步骤相当于RootOfMove中的wtw(string1,string3))

3、把中间的2块移到右边,先交换string1和string2,原因和1同理,TowerOfHanoi(2)能实现从左到右,调换左边和中间有关的操作就可以实现从中到右。最后字符串换回来。(该步骤相当于RootOfMove中的wtw(string2,string3))

 

这样一来,一个简单的递归就完成了。

技术分享

运行效果图,再也不用怕汉诺塔了!

汉诺塔的简单递归思想