关于汉诺塔的疑惑

2020-02-08 09:10发布

本帖最后由 我开心 于 2012-6-27 15:48 编辑

先贴代码
*************************************************************************************************
#include <stdio.h>
hanoi(int n,char a,char b,char c);
void move(char x,char y);
void main()
{
        int m;
        printf("please input the number");
        scanf("%d",&m);
        printf(" the solution: ");
        hanoi(m,'A','B','C');
}
hanoi(int n,char a,char b, char c)
{
        if(n==1)
        {
                move(a,c);
        }
        else
        {
                hanoi(n-1,a,c,b);
                move(a,c);
                hanoi(n-1,b,a,c);
        }
}
void move(char x,char y)
{
        printf("   %c->%c ",x,y);
}
               

令我百思不得其解的是hanoi(n-1,a,c,b);hanoi(n-1,b,a,c);两句的ac的顺序是怎样确定的,我看了下输出结果单数的时候第一次移动A->B,双数的时候第一次移动A->C,当这个n大于3的时候
进入递归调用,但是ac每次调用都会重复颠倒bc的顺序,所以会有单双数出现第一次移动不一致的结果,但是这个ac的顺序是怎么确定的呢,为什么不是ac呢,我改过程序,结果走不过去,虽然知道结果,但是不明白其中的缘由,请问哪位可以点播一下!!不胜感激



我的一点想法:其实这个程序并没有说计算多大的数,而是从最小值开始,比如2,当有两个的时候,只需要三步A->B,A->C,B->C,这样呢就可以确定第一步移动的方式,即hanoi(2-1,a,c,b),那样就确定了第一步,第二步就直接A->C,即move(a,c);剩下的一步也就顺理成章了!所以说,这个算法其实只是依据2个盘子的情况,而无需考虑更多的时候,会把人越绕越晕的!!不知道对不对,等待指教…………
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
3条回答
dosomething
2020-02-08 12:19
hanoi(int n,char a,char b, char c)
的功能是借助B把n块按照规则移动到C


所以
     if(n==1)   //当n=1时,直接把A移动到C即可
        {
                move(a,c);        
        }
        else //当n>1时
        {
                hanoi(n-1,a,c,b); //借助C先把n-1块按照规则从A移动到B
                move(a,c);         //此时C是空的,把第n块从A移动到C
                hanoi(n-1,b,a,c); //最后借助A按照规则把n-1块从B移动到C
        }

一周热门 更多>