在学习数据结构的时候,遇到汉诺塔问题,就写了自己的理解,希望对您有帮助。
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
}
}
}