/**
* Created by Luty on 2017/4/23.
*/
public class HanoiTower {
static int nDisks=6;
public static void main(String[] args){
doTower(nDisks,'A','B','C');
}
public static void doTower(int topN,char from,char inter,char to){
if (topN == 1){
System.out.println("Disk 1 from "+from+" to "+to);
}else{
doTower(topN-1,from,to,inter);
System.out.println("Disk "+topN+" from "+from+" to "+to);
doTower(topN-1,inter,from,to);
}
}
}
汉诺塔分为源塔S,过度塔I,目标塔A,S上有n个盘子,将盘子移动到A,保持大的盘子在小盘子下方:
1、如果S上只有1个盘子,将盘子移动到A上:
if (topN == 1){
System.out.println("Disk 1 from "+from+" to "+to);
}
2、A作为过渡塔,将S上的n-1移动到I上:
doTower(topN-1,from,to,inter);
3、2操作完递归调用完之后已经将S上最下方的移动到A上了,此时需要考虑将I作为源,移动到目标塔上
doTower(topN-1,inter,from,to);
总结
理解汉诺塔的问题关键在于把源塔上的n-1作为一个整体移动,但整体怎么移动我们不用关心,调用递归就好了;
想象S只有两个盘子的情况(从上到下分别为1、2),塔分别是A、B、C,1作为一个整体,首先考虑移动到B塔,2作为最后一个移动到C塔,最后B作为源塔,以A为过渡,调用递归,判断调用时为n==1,故执行topN==1的操作。