🥰🥰🥰来都来了,不妨点个关注叭!
👉博客主页:欢迎各位大佬!👈
上期内容,讲解有关递归的知识,这期我们来看看一个经典的题目吧!让我们更进一步了解递归。
1. 汉罗塔规则介绍
1> 有三根相邻的柱子,标号为A,B,C。
2> A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘。
3> 现在把所有盘子一个一个移动到柱子B上,并且每次移动同一根柱子上都不能出现大盘子在小盘子上方。
4>最后全部移动到C上面即完成
具体实现步骤在A杆上,1个盘子、2个盘子、3个盘子
下面具体演示3个盘子在A杆按照规则移动到C杆上面的的情况
假设有n个盘子,则操作2^n-1次
2.具体分析实现
pos1:起始位置
pos2:中转位置,借助位置
pos3:最终位置
1个盘子:直接从A->C
多个盘子,我们观察得到,先将【n-1】个盘子移动到B,再将A上最后一个盘子移动到C上,最后将【n-1】个在B上的盘子移动到C上,则完成。
3个盘子的情况:
4个盘子的情况
即我们可以实现递归的思想
如果是1个盘子 pos1->pos3
如果是n个盘子 hanoi(n-1,pos1,pos3,pos2)【n-1】个盘子从A(pos1)借助C(pos3)移动到最后位置B(pos2)
接着hanoi(n-1,pos2,pos1,pos3)【n-1】个盘子从B(pos2)借助A(pos1)移动到最后位置C(pos1)
则完成
最后打印出来,具体实现代码如下
3.代码实现
public class Hanoi {
public static void hanoi(int n,char pos1,char pos2,char pos3) {
if(n == 1) {
move(pos1,pos3);
return;
}
hanoi(n-1,pos1,pos3,pos2);
move(pos1,pos3);
hanoi(n-1,pos2,pos1,pos3);
}
//从某一个位置移动到某一个位置
public static void move(char pos1,char pos2) {
System.out.println(pos1 + "->" + pos2);
}
public static void main(String[] arg) {
hanoi(1,'A','B','C'); //并不是代表pos1就是A,pos2就是B,pos3就是C,只是传参的初始值
System.out.println();
hanoi(2,'A','B','C');
System.out.println();
hanoi(3,'A','B','C');
System.out.println();
}
}
本期内容到这里结束啦!有没有弄清汉罗塔问题呢!自己要多动手敲敲哦!多思考,勤动手,胜利就在前方~加油,下期见!