Java递归例题:汉诺塔问题


要求

1、从A通过B移到C上

2、移动过程中,小盘子必须在大盘子上;

分析

1、一个盘子:直接 A->C

2、两个盘子:A->B   A->C  B->C

          

         

3、三个盘子:A->C    A->B   C->B  A->C   B->A    B->C   A->C

                

                          始                                                                            A->C                                                              A->B                                                                       C->B

               

                               A->C                                                                 B->A                                                                  B->C                                                                       A->C

扫描二维码关注公众号,回复: 12421271 查看本文章

4、四个盘子:过程中也是先要做到如图(从A移动三个盘子到B), 然后A->C,至于如何将三个盘子从A 到B,这个过程与上边(三个盘子从A 借助B到C)类似,我们可以看做是三个盘子从A 借助从C移动到B。

然后考虑如何将B上的三个盘子移动到C,类似的可以想到  三个盘子从B 借助A 移动到C。

     

  • 更多盘子也是类似的移动方法,只要A上多于一个盘子,我们就先将N-1个盘子从A借助C移动到B上,再A->C,继续将N-1个盘子从B借助A移动到C上。

我们可以发现,过程中有一个类似的过程,n个盘子从  pos1  借助  pos2 移动到  pos3  ,我们可以将这个过程单独写成一个方法,这个方法使用递归写,终止条件是只有一个盘子要移动的时候。

代码

public class TestDemo {
    public static void main(String[] args) {
        hanota(1,'A','B','C');//测试一个盘子
        System.out.println();
        hanota(2,'A','B','C');//两个
        System.out.println();
        hanota(3,'A','B','C');//三个
    }
    public static void move(char pos1,char pos2){//输出
        System.out.print(pos1+"->"+pos2+" ");
    }
    public static void hanota(int n,char pos1,char pos2,char pos3){
        //n:移动的盘子的个数
        // n个盘子 从 pos1(起始位置) 借助 pos2(中途位置) 移动到 pos3(目的位置)
        if(n==1){
            move(pos1,pos3);
        }
        else{
            hanota(n-1,pos1,pos3,pos2);
            move(pos1,pos3);
            hanota(n-1,pos2,pos1,pos3);
        }
    }
}
//运行结果
A->C 
A->B A->C B->C 
A->C A->B C->B A->C B->A B->C A->C

猜你喜欢

转载自blog.csdn.net/Aug_IK/article/details/112701697
今日推荐