/**
* 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,過(guò)度塔I,目標(biāo)塔A,S上有n個(gè)盤(pán)子,將盤(pán)子移動(dòng)到A,保持大的盤(pán)子在小盤(pán)子下方:
1、如果S上只有1個(gè)盤(pán)子,將盤(pán)子移動(dòng)到A上:
if (topN == 1){
System.out.println("Disk 1 from "+from+" to "+to);
}
2、A作為過(guò)渡塔,將S上的n-1移動(dòng)到I上:
doTower(topN-1,from,to,inter);
3、2操作完遞歸調(diào)用完之后已經(jīng)將S上最下方的移動(dòng)到A上了,此時(shí)需要考慮將I作為源,移動(dòng)到目標(biāo)塔上
doTower(topN-1,inter,from,to);
總結(jié)
理解漢諾塔的問(wèn)題關(guān)鍵在于把源塔上的n-1作為一個(gè)整體移動(dòng),但整體怎么移動(dòng)我們不用關(guān)心,調(diào)用遞歸就好了;
想象S只有兩個(gè)盤(pán)子的情況(從上到下分別為1、2),塔分別是A、B、C,1作為一個(gè)整體,首先考慮移動(dòng)到B塔,2作為最后一個(gè)移動(dòng)到C塔,最后B作為源塔,以A為過(guò)渡,調(diào)用遞歸,判斷調(diào)用時(shí)為n==1,故執(zhí)行topN==1的操作。