欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

汉诺塔问题(Java实现)

程序员文章站 2022-04-25 20:26:05
...

众所周知,汉诺塔是一个经典的递归问题。但我一直对它的递归过程一知半解,可以说就是不怎么懂。今天我到知乎上看到大佬的一句话,很有感触,分享给大家:
对递归的理解的要点主要在于放弃!放弃你对于理解和跟踪递归全程的企图,只理解递归两层之间的交接,以及递归终结的条件。
品,你细品!
汉诺塔问题(Java实现)
汉诺塔问题归根结底就三步:
1.把 n-1 号盘子移动到辅助杆
2.把1号圆盘从起点移到终点
3.最后把辅助杆的n-1号盘子也移到终点

public class Hanoi {
    public static void main(String[] args) {
        move(3,'A','B','C');
        int sum=count(3);
        System.out.println("共搬运"+sum+"次");
    }
    //模拟汉诺塔的搬运过程
    public static void move(int n,char start,char middle,char end){
        //start表示起始杆的名称,end表示目标杆名称,middle表示辅助杆名称,n表示待搬运的圆盘数量
        if(n==1) {
            System.out.println(start + "——>" + end);
            return;
        }//只有一个盘子时,直接搬到终点一步到位
        else{
            move(n-1,start,end,middle);//把n-1个盘子移动到辅助杆
            System.out.println(start + "——>" + end);//把最大圆盘从起始杆搬到目标杆
            move(n-1,middle,start,end);//最后把辅助杆的n-1号盘子也移到终点
        }
    }
    //计算n个圆盘搬运的总次数
    public static int count(int n){
            if(n==1)
                return 1;
            else
            {
                int count1=count(n-1);//把n-1个盘子移动到辅助杆
                int count2=1;//把最大圆盘从起始杆搬到目标杆
                int count3=count(n-1);//最后把辅助杆的n-1号盘子也移到终点
                return count1+count2+count3;
            }
    }

}

运行结果:
汉诺塔问题(Java实现)
其实n块圆盘总搬运次数有一个公式:count(n)=2^n-1
在这里,我就不细推了

相关标签: java recursion