秒懂经典汉诺塔问题 分治法 JAVA实现 轻松理解

汉诺塔问题是什么 就不多说了

先看一下代码 很经典的分治法

public static void hanoiTower(int num,char a,char b,char c){
    //如果只有一个盘 , 直接移动
    if(num==1){
        System.out.println("第1个盘从 "+a+" 移动到  "+c);
    }else {
        hanoiTower(num-1,a,c,b);
        System.out.println("第"+num+"个盘从 "+a+" 移动到  "+c);
        hanoiTower(num-1,b,a,c);
    }
}

第一次看见很懵B 只会背着写下来但不理解

其实只要把参数理解就可以了

先把参数解释一下:

public static void hanoiTower(int num,char a,char b,char c)

第一个参数 num : 盘的个数
第二个参数 a: 起始塔
第三个参数 b: 帮助我们移动的塔
第四个参数 c: 目标塔
为什么要加第一个第二个第三个第四个

其实移动的过程就是把盘从第二个参数移动到第四个参数

理解了参数含义 就很好理解递归过程

以俩个塔为例 解释一下

第一步
执行方法 hanoiTower(2,‘A’,‘B’,‘C’);
参数含义:
2 : 盘的个数为2
A: 起始塔
B: 帮助我们移动的塔
C: 目标塔

所以这个方法的意思就是 把2个盘从A塔移动到C塔

秒懂经典汉诺塔问题 分治法 JAVA实现 轻松理解_第1张图片

第二步
判断num 发现num>1 执行代码 hanoiTower(num-1,a,c,b)

方法 public static void hanoiTower(int num-1,char a,char c,char b)

参数含义 :
num-1 : 盘的个数为num-1 这里为1
a: 起始塔
c: 帮助我们移动的塔
b: 目标塔

所以这句代码的意思就是 把1个盘从A塔移动到B塔

怎么把1个盘从A塔移动到B塔? 那和我们把1个盘从A塔移动到C塔不是一样的道理吗? (记住这句话)
好的进入方法 判断 num==1 , 输出语句 System.out.println("第1个盘从 “+a+” 移动到 "+b); 方法结束
秒懂经典汉诺塔问题 分治法 JAVA实现 轻松理解_第2张图片

第三步
回到原方法
执行代码 System.out.println(“第”+num+"个盘从 “+a+” 移动到 "+c); //第2个盘从 A 移动到 C

秒懂经典汉诺塔问题 分治法 JAVA实现 轻松理解_第3张图片

第四步
执行代码 hanoiTower(num-1,b,a,c);
方法 public static void hanoiTower(int num-1,char b,char a,char c)
参数含义 :
num-1 : 盘的个数为num-1 这里为1
b: 起始塔
a: 帮助我们移动的塔
c: 目标塔

所以这句代码的意思就是 把1个盘从B塔移动到C塔

好的进入方法 判断 num==1 , 输出语句 System.out.println("第1个盘从 “+b+” 移动到 "+c); 方法结束

秒懂经典汉诺塔问题 分治法 JAVA实现 轻松理解_第4张图片

第五步 回到原方法 方法结束 搞定
秒懂经典汉诺塔问题 分治法 JAVA实现 轻松理解_第5张图片

有人说2个盘肯定好理解 3个盘或者更多那

其实理解了2个盘 那就搞定了

以3个盘为例

第一步
hanoiTower(3,‘A’,‘B’,‘C’);

代码意思: 把3个盘从A塔移动到C塔

第二步
判断num 发现num>1 执行代码 hanoiTower(num-1,a,c,b)
进入到方法 public static void hanoiTower(int num-1,char a,char c,char b)

代码意思: 把2个盘从A塔移动到B塔

怎么把2个盘从A塔移动到B塔? 那和我们把2个盘从A塔移动到C塔不是一样的道理吗?

以4个盘为例

第一步
hanoiTower(4,‘A’,‘B’,‘C’);

代码意思: 把4个盘从A塔移动到C塔

第二步
判断num 发现num>1 执行代码 hanoiTower(num-1,a,c,b)
进入到方法 public static void hanoiTower(int num-1,char a,char c,char b)

代码意思: 把3个盘从A塔移动到B塔

怎么把3个盘从A塔移动到B塔? 那和我们把3个盘从A塔移动到C塔不是一样的道理吗?

你可能感兴趣的:(算法)