汉诺塔问题是什么 就不多说了
先看一下代码 很经典的分治法
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: 目标塔
第二步
判断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塔移动到C塔不是一样的道理吗? (记住这句话)
好的进入方法 判断 num==1 , 输出语句 System.out.println("第1个盘从 “+a+” 移动到 "+b); 方法结束
第三步
回到原方法
执行代码 System.out.println(“第”+num+"个盘从 “+a+” 移动到 "+c); //第2个盘从 A 移动到 C
第四步
执行代码 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: 目标塔
好的进入方法 判断 num==1 , 输出语句 System.out.println("第1个盘从 “+b+” 移动到 "+c); 方法结束
其实理解了2个盘 那就搞定了
以3个盘为例
第一步
hanoiTower(3,‘A’,‘B’,‘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塔移动到C塔不是一样的道理吗?
…
以4个盘为例
第一步
hanoiTower(4,‘A’,‘B’,‘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塔移动到C塔不是一样的道理吗?
…