汉诺塔问题——递归法

汉诺塔(又称河内塔)问题是印度的一个古老的传说。开天辟地的神勃拉玛在一个庙里留下了三根金刚石的棒,第一根上面套着64个圆的金片,最大的一个在底下,其余一个比一个小,依次叠上去,庙里的众僧不倦地把它们一个个地从这根棒搬到另一根棒上,规定可利用中间的一根棒作为帮助,但每次只能搬一个,而且大的不能放在小的上面。

首先当只有一个盘子时,直接有1号木桩移动到3号木桩:

这里写图片描述

而当有两个盘子时:

这里写图片描述

后面当有n个盘子时,可以把它假象为两个部分,下面的那个最大的盘子为一部分,上面的n-1个盘子为一部分,这样两个部分的算法其实就和两个盘子的算法差不多:

这里写图片描述

代码实现用了递归法:

package study;
//汉诺塔
public class HanNuoTa {
     public static void han(char pos1,char pos2){
         System.out.println("盘子从"+pos1+"--->"+pos2);
     }
     public static void nuo(int n,char pos1,char pos2,char pos3) {

         if(n == 1){
             han(pos1,pos2);
         }
         else{
             nuo(n-1,pos1,pos3,pos2);/*把n个盘子看做两个整体部分,把n-1个盘看作一个整体,从塔1移到塔2;
                                                                                    把最大的那个盘n盘看作一个整体,从塔1移到塔3;
                                     */
             han(pos1,pos2);
             nuo(n-1,pos3,pos2,pos1);//把n-1看做一个整体从塔2移到塔3;
         }

     } 



public static void main(String[] args) {
          nuo(4,'A','B','C');
    }

}

结果:

盘子从A--->C
盘子从A--->B
盘子从C--->B
盘子从A--->C
盘子从B--->A
盘子从B--->C
盘子从A--->C
盘子从A--->B
盘子从C--->B
盘子从C--->A
盘子从B--->A
盘子从C--->B
盘子从A--->C
盘子从A--->B
盘子从C--->B

猜你喜欢

转载自blog.csdn.net/qq2899349953/article/details/80294136