Java-方法的使用-递归求解汉诺塔问题

北战南征 提交于 2020-02-08 17:09:47

递归求解汉诺塔问题 ​

汉诺塔问题是一个经典的问题。汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说。 大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。 大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。 并且规定,任何时候,在小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘。 问应该如何操作?

对问题的分析:
将n个盘子从A座上移到C座上可分解为以下三个步骤:
(1)将A上的n-1个盘子借助C先移到B上;
递归方法分解为:
· 将A上1个盘子从A移到C;
· 将A上1个盘子从A移到B;
· 将C上1个盘子从C移到B;
(2)将A座上剩下的一个盘移到C座上;
(3)将n-1个盘从B座借助于A座移到C座上;
递归方法分解为:
· 将B上1个盘子从B移到A;
· 将B上1个盘子从B移到C;
· 将A上1个盘子从A移到C;
其中步骤(1)和步骤(3)都是将n-1个盘从一个座移到另一个座上,采取的办法一样,只是座的名字不同。为了使之一般化,可以将步骤(1)和步骤(2)表示为:
将“one”座上的n-1个盘移到“two”座(借助“three”座)
在步骤(1)中:
one对应A,two对应B,three对应C
在步骤(3)中:
one对应B,two对应C,three对应A
所以,我们可以把三个步骤分成两类操作:
(1)将n-1个盘子从一个座移到另一个座上;
(2)将1个盘子从一个座移到另一个座上;

编写代码的思路:
用Hanoi函数实现操作(1);用Move函数实现操作(2)
函数调用Hanoi(n,one,two,three)表示将“one”座上的n-1个盘移到“two”座(借助“three”座)
函数调用Move(x,y)表示将1个盘子从x座移到y座上

代码实现:

package gyy;
import java.util.Scanner;
public class yinger {
 static int i=0;//移动次数;
 public static void main(String[] args) {
  System.out.print("请输入盘子的数量:");
  Scanner sc=new Scanner(System.in);
  int m=sc.nextInt();
  System.out.print("移动"+m+"个盘子的步骤:");
  System.out.println();
  Hanoi(m,'A','B','C');
  System.out.println("移动的次数:"+i);
  sc.close();
 }
 static void Hanoi(int n,char one,char two,char three) {
   if(n==1) {
    i++;
    System.out.println("将盘子"+n+"从"+one+"移动到"+three);
   }else {
    Hanoi(n-1,one,three,two);
    i++;
    System.out.println("将盘子"+n+"从"+one+"移动到"+three);
    Hanoi(n-1,two,one,three);
   }
 }
}

运行结果:

请输入盘子的数量:6
移动6个盘子的步骤:
将盘子1从A移动到B
将盘子2从A移动到C
将盘子1从B移动到C
将盘子3从A移动到B
将盘子1从C移动到A
将盘子2从C移动到B
将盘子1从A移动到B
将盘子4从A移动到C
将盘子1从B移动到C
将盘子2从B移动到A
将盘子1从C移动到A
将盘子3从B移动到C
将盘子1从A移动到B
将盘子2从A移动到C
将盘子1从B移动到C
将盘子5从A移动到B
将盘子1从C移动到A
将盘子2从C移动到B
将盘子1从A移动到B
将盘子3从C移动到A
将盘子1从B移动到C
将盘子2从B移动到A
将盘子1从C移动到A
将盘子4从C移动到B
将盘子1从A移动到B
将盘子2从A移动到C
将盘子1从B移动到C
将盘子3从A移动到B
将盘子1从C移动到A
将盘子2从C移动到B
将盘子1从A移动到B
将盘子6从A移动到C
将盘子1从B移动到C
将盘子2从B移动到A
将盘子1从C移动到A
将盘子3从B移动到C
将盘子1从A移动到B
将盘子2从A移动到C
将盘子1从B移动到C
将盘子4从B移动到A
将盘子1从C移动到A
将盘子2从C移动到B
将盘子1从A移动到B
将盘子3从C移动到A
将盘子1从B移动到C
将盘子2从B移动到A
将盘子1从C移动到A
将盘子5从B移动到C
将盘子1从A移动到B
将盘子2从A移动到C
将盘子1从B移动到C
将盘子3从A移动到B
将盘子1从C移动到A
将盘子2从C移动到B
将盘子1从A移动到B
将盘子4从A移动到C
将盘子1从B移动到C
将盘子2从B移动到A
将盘子1从C移动到A
将盘子3从B移动到C
将盘子1从A移动到B
将盘子2从A移动到C
将盘子1从B移动到C
移动的次数:63
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!