【理解】汉诺塔问题,新手看这里

最近在研究数据结构,书中提到了汉诺塔这一问题,由于代码太过简介,所以看懂这段代码花费了我一点时间,现在我把分析过程分享出来,便于新手朋友理解。

首先,先解释一下什么是汉诺塔:

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

然后,代码分析(分析过程已在代码中注释)

package ch03;

public class Example3_4 {
	// c为移动次数
	private int c = 0;
	
	// 构造汉诺塔
	// 参数一:圆盘序号
	// 参数二:原塔(初始时,圆盘所在的塔)
	// 参数三:辅助塔
	// 参数四:目标塔(圆盘最终需要移动到的塔)
	public void hanoi(int n, char x, char y, char z) {
		//	如果圆盘序号为1,只需移动一次即可到达目标盘
		if(n == 1) {
			move(x, 1, z);
		}
		//	如果圆盘序号大于1,则需要借助辅助塔,将其它盘移走
		//	移动步骤:
		//	1.将压在目标圆盘之上的所有圆盘移动到辅助塔(这时,以目标塔作为辅助塔)
		//	2.将目标圆盘移动到目标塔上
		else {
			// 将序号为1到n-1的圆盘,从原塔x,借助辅助塔z,移动到塔y上
			hanoi(n - 1 , x, z, y);
			// 将序号为n的圆盘从x塔移动到z塔(目标塔)
			move(x, n, z);
			// 更新汉诺塔(由于移动,此时x塔已为空塔,在接下来的操作中,我们可以把它当做辅助塔)
			// 将序号为1到n-1的圆盘,从原塔y,借助辅助塔x,移动到塔z上
			// 注意:z塔为最终的目标塔
			hanoi(n - 1, y, x, z);
		}
	}

	//	移动圆盘
	//	参数一:原塔
	//	参数二:圆盘序号
	//	参数三:目标塔
	public void move(char x, int n, char z) {
		//	日常输出
		System.out.println("第" + ++c + "次移动:" + n + "号圆盘," + x + "->" + z);		
	}

	public static void main(String[] args) {
		Example3_4 e = new Example3_4();
		e.hanoi(4, 'x', 'y', 'z');
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值