利用递归解决汉诺塔问题

汉诺塔问题求解

      汉诺塔问题的描述如下:有A、B、C 3根柱子,在A上从下往上按照从大到小的顺序排列着64个圆盘,以B柱子为中介,把盘子全部移动到C 上。移动过程中,要求任意盘子的下面要么没有盘子,要么只能有比它大的盘子。下边为求解3阶汉诺塔问题的具体程序。在包ace中创建了一个HanoiTower类,然后在类中定义一个moveDish的方法,整个程序运用递归方法实现汉诺塔问题的求解。

一、第一种方式

 

package ace;
public class HanoiTower{
	public static void moveDish(int level,char from,char inter,char to) {
		if(level==1) {//如果只有一个盘子就退出迭代
			System.out.println("从"+from+"移动盘子1号到"+to);
		}else {      //如果大于一个盘子就继续迭代
			moveDish(level-1,from,to,inter);
			System.out.println("从"+from+"移动盘子"+level+"号到"+to);
			moveDish(level-1,inter,from,to);
		}
	}
	public static void main(String[] args) {
		int nDisks=3;                //设置汉诺塔的阶数为3
		moveDish(nDisks,'A','B','C');//实现移动算法
	}
}

       运行结果如下图所示

二、第二种方式

package ace;
public class HanoiTower{
	  public static void main(String[] args) {
	        hanoi(3, 'A', 'B', 'C');
	        System.out.println("ABC:小脑斧" );
	    }
	    /**
	     * 汉诺塔
	     * @param n n个盘子
	     * @param start 起始柱子
	     * @param transfer 中转柱子
	     * @param target 目标柱子
	     */
	    public static void hanoi(int n, char start, char transfer, char target) {
	        //只有一个盘子,直接搬到目标柱子
	        if (n == 1) {
	            System.out.println(start + "---->" + target);
	        } else {
	            //起始柱子借助目标柱子将盘子都移动到中转柱子中(除了最大的盘子)
	            hanoi(n - 1, start, target, transfer);
	            System.out.println(start + "---->" + target);
	            //中转柱子借助起始柱子将盘子都移动到目标柱子中
	            hanoi(n - 1, transfer, start, target);
	        }
	    }
}

运行结果为:

A---->C
A---->B
C---->B
A---->C
B---->A
B---->C
A---->C
ABC:小脑斧
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值