递归经典例题——汉诺塔

简介: 递归经典例题——汉诺塔

一、汉诺塔的背景故事

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

二、找规律

当一个金片时

当二个金片时

当三个金片时

当四个金片时

三、了解什么是递归

一个方法在执行过程中调用自身, 就称为 “递归”.

递归相当于数学上的 “数学归纳法”, 有一个起始条件, 然后有一个递推公式.


例如, 我们求 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

创造不易,如果本篇对你有所帮助,请给我一个免费的赞!如有不同见解或者疑惑,欢迎在评论区留言!


目录
相关文章
|
3月前
|
算法 C语言
汉诺塔问题(利用递归解决)内含斐波那契数列0.o
汉诺塔问题(利用递归解决)内含斐波那契数列0.o
35 0
|
11月前
|
存储 算法
蓝桥杯:递归 与 例题:斐波那契数列及优化与应用
蓝桥杯:递归 与 例题:斐波那契数列及优化与应用
66 0
|
3月前
|
人工智能 算法
[第一章]递归与递推
[第一章]递归与递推
47 0
|
9月前
经典递归问题:汉诺塔【超详解】
经典递归问题:汉诺塔【超详解】
203 0
|
10月前
|
存储
浅谈递归函数(最后一个例题:浅谈汉诺塔思路与代码)
浅谈递归函数(最后一个例题:浅谈汉诺塔思路与代码)
|
12月前
|
算法
解密汉诺塔问题:递归与分治的经典探索
解密汉诺塔问题:递归与分治的经典探索
379 0
|
机器学习/深度学习 算法 定位技术
BFS经典例题详解
BFS经典例题详解
116 0
|
Web App开发 算法 测试技术
单调栈的经典例题
单调栈的经典例题
89 0
汉诺塔?爬楼梯?斐波那契?知道递归就够了
汉诺塔?爬楼梯?斐波那契?知道递归就够了
79 0
|
C语言
【C】青蛙跳台阶和汉诺塔问题(递归)
【C】青蛙跳台阶和汉诺塔问题(递归)
111 0
【C】青蛙跳台阶和汉诺塔问题(递归)