关于汉诺塔问题(递归)

初学C++或者C语言的同学们可能对汉诺塔问题了解不是很深刻,相信在这篇博客中,你会得到不一样的理解。

 

首先,汉诺塔问题的来源:汉诺塔(Tower of Hanoi)源于印度传说中,大梵天创造世界时造了三根金钢石柱子,其中一根柱子自底向上叠着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。好了,别看上面关于汉诺塔的介绍巴拉巴拉的,总的来说,就是有三个小柱子,分别是A,B,C。A柱子上面有很多饼干(这些饼干都是最下面的最大,最上面的最小,有顺序),假设有三块这样的饼干(饼大,饼二,饼三,饼大是最大的饼干,饼三最小),现在要将这些饼干放到C上面,注意,一定不能打乱顺序,也就是,不管你怎么移动,大的饼干总是在下面,小的总是在上面,好啦,现在我们就来移动吧!

 

1.首先,一定要搞清楚,3个饼干要从A移动到C,分几步呢?大家已经知道如果两个数比如2,3要交换其位置,我们要用第三个temp来暂时保存2或者保存3,然后进行赋值即可,这也是一样的,我们首先要把上面的两块(记住,一定一定要把这两块饼干当成整体,后面你会很好理解的)移动到B,为什么?因为B就相当于temp,也就是基柱,我们把最上面的两块饼干放到B上,那么再把饼大放到C上,是不是完成了一个小步?那么饼二和饼三在B上怎么移动到C上呢?这就要考虑整体的问题了,一定要明白一点,那就是饼大放到了C上之后,是不会移动的!这就相当于什么呢,我给饼大找好了位置,以后不考虑饼大了,只考虑两小弟,就可以把C相当于一个空柱子,往上面放东西就行了。现在就一目了然,饼二饼三在B上,要移动到C,A是个空柱子,C也相当于空柱子,是不是又回到了我们的起点,就是如果A柱子上只有两个饼,移动到C上的问题?(这句话要好好思考),这就是说,B柱子上的两个饼,要通过A,移动到C,就是一个两层汉诺塔问题,之后我就不详细解释怎么通过一个基柱移动两个饼干的问题了,大家可以自己画一下。

 

2.c++程序表达就是如下:

#include
using namespace std;


void move(char A,char C) {
    cout<"< }

void hanoi(int n,char A,char B,char C) {
    if(n==1)
        move(A,C);
    else {
        hanoi(n-1,A,C,B); //执行将A上的n-1个盘子放到柱B上,以C为基柱
        move(A,C);//等A上的n-1个盘子全部放到了柱B上后,就可以将最大的盘子放到C上
        hanoi(n-1,B,A,C);//这个时候A就空出来了,相当于基柱,之后就将B上的n-1个盘子放到C上,此时利用A基柱即可
    }
}

int main() {
    int m;
    cout<<"Enter the numbers of dishes: ";
    cin>>m;
    cout<<"the steps to moving "<     hanoi(m,'A','B','C');
    return 0;
}

 

 

3.其中最关键的就是我标红的那三句话,一定要多理解几遍,具体就是一直会以多出来的那个为基柱,然后移动到另一个柱子就行了,看不懂 记住这个移动顺序,首先以C为基柱,移动到B,然后以A为基柱,移动到C。递归的过程可以手动模拟一下,思想知道就行了,一般面试的话也是会问一些汉诺塔的思想或者手写一下代码。

 

 

 

 

 

你可能感兴趣的:(计算机,C/C++,算法与数据结构)