递归经典例题——汉诺塔

文章目录

  • 一、汉诺塔的背景故事
  • 二、找规律
  • 三、了解什么是递归
  • 四、分析问题
  • 五、核心思想
  • 六、代码实现
  • 七、完整代码

一、汉诺塔的背景故事

在印度,有这么一个古老的传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。 印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片,一次只移动一片,不管在哪根针上,小片必在大片上面,该怎样移动呢?
递归经典例题——汉诺塔_第1张图片

二、找规律

当一个金片时
递归经典例题——汉诺塔_第2张图片

当二个金片时
递归经典例题——汉诺塔_第3张图片

当三个金片时
递归经典例题——汉诺塔_第4张图片
当四个金片时
递归经典例题——汉诺塔_第5张图片

三、了解什么是递归

一个方法在执行过程中调用自身, 就称为 “递归”.
递归相当于数学上的 “数学归纳法”, 有一个起始条件, 然后有一个递推公式.

例如, 我们求 N!
起始条件: N = 1 的时候, N! 为 1. 这个起始条件相当于递归的结束条件.
递归公式: 求 N! , 直接不好求, 可以把问题转换成 N! => N * (N-1)!

递归的必要条件:

  1. 将原问题划分成其子问题,注意:子问题必须要与原问题的解法相同
  2. 递归出口

四、分析问题

当只有一个金片时,直接将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
创造不易,如果本篇对你有所帮助,请给我一个免费的赞!如有不同见解或者疑惑,欢迎在评论区留言!

你可能感兴趣的:(开发语言,java)