在印度,有这么一个古老的传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。 印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片,一次只移动一片,不管在哪根针上,小片必在大片上面,该怎样移动呢?
一个方法在执行过程中调用自身, 就称为 “递归”.
递归相当于数学上的 “数学归纳法”, 有一个起始条件, 然后有一个递推公式.
例如, 我们求 N!
起始条件: N = 1 的时候, N! 为 1. 这个起始条件相当于递归的结束条件.
递归公式: 求 N! , 直接不好求, 可以把问题转换成 N! => N * (N-1)!
递归的必要条件:
当只有一个金片时,直接将A中的金片移动到C,也就是递归的出口,
通过观察发现:
前n-1个金片都需要借助C移动到B(如:当有两个金片时的第2步;当有三个金片时的第4步)
然后将第n个金片移动到C(如:当有两个金片时的第3步;当有三个金片时的第5步)
最后将B上的n-1个金片借助A移动到C(如:当有两个金片时的第4步;当有三个金片时的第8步)
假设总共需要移动n个盘子
1.将A柱上的n-1个盘子借助C柱移向B柱
2.将A柱上仅剩的最后一个盘子移向C柱
3.将B柱上的n-1个盘子借助A柱移向C柱
public static void move(char pos1,char pos2) {
System.out.print(pos1+"->"+pos2+" ");
}
public static void hanio(int n,char pos1,char pos2,char pos3) {
if (n == 1) {
move(pos1,pos3);
return;
}
hanio(n - 1, pos1, pos3, pos2);
move(pos1, pos3);
hanio(n - 1, pos2, pos1, pos3);
}
//汉诺塔
//5.代码实现的思路主要分为三步:
//假设总共需要移动n个盘子
//1.将A柱上的n-1个盘子借助C柱移向B柱
//2.将A柱上仅剩的最后一个盘子移向C柱
//3.将B柱上的n-1个盘子借助A柱移向C柱
public class Test1 {
public static void move(char pos1,char pos2) {
System.out.print(pos1+"->"+pos2+" ");
}
public static void hanio(int n,char pos1,char pos2,char pos3) {
if (n == 1) {
move(pos1,pos3);
return;
}
hanio(n - 1, pos1, pos3, pos2);
move(pos1, pos3);
hanio(n - 1, pos2, pos1, pos3);
}
public static void main(String[] args) {
hanio(2,'A','B','C');
System.out.println();
hanio(3,'A','B','C');
System.out.println();
hanio(4,'A','B','C');
}
}
运行结果
个人感想:汉诺塔问题太抽象了,很难理解,我也是看了很多的讲解,自己理解的也不是很深刻,如果看本篇文章,建议多看几遍,自己动手画画,或者可以结合讲解视频很好理解https://www.bilibili.com/video/BV13g41157wn/?spm_id_from=333.337.search-card.all.click&vd_source=c4431a843d0ae8768db0a00385b128a2
创造不易,如果本篇对你有所帮助,请给我一个免费的赞!如有不同见解或者疑惑,欢迎在评论区留言!