//汉诺塔算法
public static void main(String[] args) {
int nDisks = 3;
doTower(nDisks, 'A', 'B', 'C');
//调用doTower方法,用static可以直接调用,不需要用构造器构造后调用
}
public static void doTower(int topN,char from,char inter,char to){
//汉诺塔有个很明确的特性,奇数:顶端一个移动到C位置,偶数:顶端的要先移动到B位置
//入参: 3 ,a ,b ,c
if(topN == 1)//topN==1才走这个逻辑
System.out.println("..Disk 1 from "+from+" to "+to);
else{
//topN-1的思想:要留一个,最后一个直接从A移到C的位置
// from, to, inter 排序思想:要移动的数量特性:奇数(顶上移动到c) 偶数(顶上移动到b)
//topN==1 的话不走这个逻辑,直接移动到c,topN==2:topN-1 得到是1, b和c换个位置,调用本身方法。走if逻辑,虽然参数名称还是to,实际值已经是b了
//采用了递归:出入栈的方式,一层一层的进入,一层一层的出来
//入参第一次: topN==3,a,b,c
//else.doTower[1] = 2 ,a,c,b 入第一层,对应变量:from,inter,to
// doTower[1]: topN==2,a,c,b 入参 ,跳过if, 调用 doTower[1] 后:1,a,b,c 入第二层,对应变量:from,inter,to
//走if,把最上面的一个移动到c [大,中] [] [小]
//退出第二层,返回第一层,入参的值为:2,a,c,b
//else中第一层 第二行: a中拿一个移到c (System的语句)2,a,c,b 对应的入参变量是:from,inter,to [大] [中] [小]
//else中第一层.第三行:程序走到else.doTower[2]== 2,a,c,b,调用doTower后的参数顺序为:1 c,a,b 对应入参方法变量:from,inter,to 进入doTower[2],第二层
//程序走到else.doTower[1]==2 c,a,b ,再次调用doTower,参数为:1 c,a,b,对应入参变量:from,inter,to ,调用if:c 中拿个移到b[大][中,小][]
//if走完后退出第二次进入的第二层,返回第一层,执行完else.doTower[2]后,退出doTower[1]的第一层,返回原始层
//原始层,main方法中doTower()的else.doTower[1]走完,开始走ease的第二行代码,第一层参数:3,a,b,c入参变量是:from,inter,to
//原始层,else.system, from+" to "+to [大][中,小][] > [][中,小][大] main方法中doTower()的else第二行代码走完
//原始层,doTower().else.doTower[2]:参数:3,a,b,c,对应变量:from,inter,to 调用自身方法后参数:2,b,a,c,进入doTower[2]第一层
//doTower[2]第一层,跳过if,进入else,调用else.doTower[1]: 2,b,a,c > 1,b,c,a 调用自身方法, 入参变量名from,inter,to
//doTower[2]第一层.else.doTower[1]第二层.if from+" to "+to from,inter,to(1,b,c,a ) b拿一个到a [][中,小][大] > [小][中][大]
//退出if第二层,返回doTower[2]第一层,走else第二行代码from "+from+" to "+to :第一层参数:(from,inter,to )2,b,a,c,
//doTower[2]第一层,走else第二行代码:from+" to "+to b拿一个到c [小][中][大]>[小][][中,大]
//doTower[2]第一层,走else第三行代码,参数(from,inter,to )2,b,a,c, 调用 doTower[2], 入参后:1,a,b,c,进入第二层
//第二层调用if from+" to "+to, 参数(from,inter,to ) 1,a,b,c a拿一个到c [小][][中,大]>[][][小,中,大],执行完退出第二层
//返回第一层.else第三行代码,下面没有可执行代码,返回原始层,原始层,doTower().else.doTower[2]没有可进行代码,退出程序
doTower(topN-1, from, to, inter);
System.out.println("Disk "+topN+" from "+from+" to "+to);
doTower(topN-1, inter, from, to);
}
}