【java数据结构】递推解决的汉诺塔问题

在学习数据结构的时候,遇到汉诺塔问题,就写了自己的理解,希望对您有帮助。

package com.qxlx.six;

/**
 * 递推解决的汉诺塔问题
 * 
 * @author jia
 *
 */
public class TowerApp {

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

	/**
	 * 理解:汉诺塔问题 如果试图要移动的盘子是奇数个盘子,开始时直接把最顶端的盘子移动到想要把这颗树移动到的那个数上
	 * 如果视图要移动的盘子是偶数个盘子,开始时直接把最顶端的盘子移动到中介塔座上。 如何理解这个问题, 假设把问题具体化,典例话,
	 * 现在假象这样一种情况,如果在A处只有一个盘子的话,想要将这一个盘子直接移动到C处,那么就可以直接
	 * 移动到C处了。这是奇数的情况下,但是如果是偶数,或者是0个盘子的话,那么就需要先将A处最上面的那个盘子
	 * 先移动到B处,将A处最后一个盘子移动到C处。然后将B处的盘子移动到C处,这样的话,就可以实现了目的。
	 * 
	 * 
	 * xiaogong 理解:假设初始盘子数目为奇数,那么最上面的盘子一定先从A到C,即递归到最后一层时,topN == 1,
	 * 所以from、inner、to的值分别为‘A’‘B’‘C’。那么此层递归完毕,返回上层递归。由于此层递归是
	 * 最上面的盘子从A到C,那么上一层递归也就是下一步操作一定第二个盘子是A到B,【那么上一层的from、
	 * inner、to一定是‘A’‘C’‘B’!!!】。将第二个盘子移到B了以后,第三步操作毋庸置疑是将先前
	 * 移到C的第一个盘子移到B,应该再递归一次,并且.已经知道了from、inner、to的值。此时,我们已经分
	 * 析完了最里面两层的操作。第三层的参数又是什么呢?其实这时候又回归了第一层,即from、inner、to
	 * 的值分别为‘A’‘B’‘C’。这一步操作是将第三个盘子从A移到C。这一层还有一个递归操作是将B上面
	 * 的两个盘子移到C即第三个盘子上面。至此,3个盘子已经完美地从A移到了C。如果还有第四个、第五个盘 子,以此类推。
	 * 
	 * @param tonN
	 *            顶部的盘子
	 * @param from
	 *            源塔座(顶部盘子的起点) A
	 * @param inner
	 *            中介塔座(中介作用) B
	 * @param to
	 *            目标塔座(顶部盘子的终点) C
	 */
	public static void doTowers(int tonN, char from, char inner, char to) {
		// 如果只有一块盘子,直接移动过去就可以了
		if (tonN == 1)
			System.out.println("Disk 1 from " + from + " to " + to); // A C
		else {
			// 否则的话 就先把 n-1块移动到中间
			doTowers(tonN - 1, from, to, inner);// from > inner A B
			// 然后把最后
			System.out.println("Disk " + tonN + " from " + from + " to " + to);
			// 把中间的一块移动到to
			doTowers(tonN - 1, inner, from, to);//
		}
	}

	public static void doTorwers2(int number, char from, char center, char to) {
		// 假如是一块盘子的话,直接从A移动到C处
		if (number == 1)
			System.out.println("Disk 1 " + from + " to" + to);//  A --->C
		else {
			doTorwers2(number - 1, from, to, center);// A--->B

			System.out.println("Disk " + number + "from " + from + "to" + to);

			doTorwers2(number - 1, center, from, to);//B--->C

		}

	}
	
	public static void doTowers3(int number,char from,char center,char to){
		if(number==1)
			System.out.println("Disk 1 "+from+" to "+to); //A-C
		else{
			doTowers3(number-1, from, to,center );//A-B
			System.out.println("Disk "+from+" to "+center);
			doTowers3(number-1, center, from, to);//B-C
		}
	}
	
	
	
	
	
	
	

}

猜你喜欢

转载自blog.csdn.net/jia970426/article/details/82787838