递归应用(1) Hanoi塔问题

/**
 * 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的操作。

你可能感兴趣的:(递归应用(1) Hanoi塔问题)