递归经典例题——汉诺塔

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

一、汉诺塔的背景故事

在印度,有这么一个古老的传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。 印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的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

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


目录
相关文章
|
6月前
|
人工智能 监控 开发者
详解大模型应用可观测全链路
阿里云可观测解决方案从几个方面来尝试帮助使用 QwQ、Deepseek 的 LLM 应用开发者来满足领域化的可观测述求。
1534 157
详解大模型应用可观测全链路
|
11月前
|
算法 定位技术
数据结构与算法学习九:学习递归。递归的经典实例:打印问题、阶乘问题、递归-迷宫问题、八皇后问题
本文详细介绍了递归的概念、重要规则、形式,并展示了递归在解决打印问题、阶乘问题、迷宫问题和八皇后问题等经典实例中的应用。
228 0
|
6月前
|
人工智能 IDE 测试技术
魔搭×通义灵码:0代码基础、0门槛在线编程做应用
本节课主要介绍了如何利用 Notebook IDE 环境和通义灵码工具来具体开发 AI 产品,通过前面的介绍,可以感受到好的开发环境和开发工具往往可以让开发过程事半功倍,也可以更快更好地解决一些实际问题。随着 AI 代码生成工具不断成熟,动动手指,你的 AI 产品马上变成现实~
|
7月前
|
机器学习/深度学习 人工智能 PyTorch
DeepSeek进阶开发与应用1:DeepSeek框架概述与基础应用
DeepSeek是一个高效、灵活的深度学习框架,旨在简化模型的构建、训练和评估。其核心特点包括模块化设计、自动微分、多后端支持及易于扩展。本文通过手写数字识别的CNN模型实例,展示了DeepSeek的安装、数据准备、模型构建、编译、训练与评估过程,最终模型在测试集上达到了98%以上的准确率。
|
8月前
|
运维 监控 Cloud Native
构建深度可观测、可集成的网络智能运维平台
本文介绍了构建深度可观测、可集成的网络智能运维平台(简称NIS),旨在解决云上网络运维面临的复杂挑战。内容涵盖云网络运维的三大难题、打造云原生AIOps工具集的解决思路、可观测性对业务稳定的重要性,以及产品发布的亮点,包括流量分析NPM、网络架构巡检和自动化运维OpenAPI,助力客户实现自助运维与优化。
|
10月前
|
前端开发 SEO
网站建设选择什么方式适合?
网站建设适合选择什么方式适合?选择适合的网站建设方式需要考虑多个因素,包括技术能力、开发时间、建站预算和网站实现功能需求等。
194 3
|
10月前
|
机器学习/深度学习 人工智能 编解码
全面升级的“新清影”,给AI生成视频带来了哪些新玩法?
智谱清言App近日上线了“新清影”,并开源了最新的图生视频模型CogVideoX v1.5。相比之前的版本,“新清影”在视频分辨率、生成速度、多通道生成能力和模型性能等方面均有显著提升,支持生成10秒、4K、60帧的超高清视频。此外,即将上线的音效功能将进一步提升视频的逼真度和实用性,标志着AI视频创作进入“有声时代”。这些改进使得内容创作变得更加高效和便捷,为创作者提供了更多可能性。
279 2
|
算法 程序员 C语言
C++设计哲学:构建高效和灵活代码的艺术
C++设计哲学:构建高效和灵活代码的艺术
230 1
|
缓存 NoSQL 安全
Redis 新特性篇:多线程模型解读
Redis 新特性篇:多线程模型解读
336 5
|
算法 Python
使用深度优先搜索算法解决迷宫问题
迷宫问题是一个经典的算法问题,涉及到通过一个迷宫找到从起点到终点的路径。在本篇博客中,我们将探讨如何使用深度优先搜索(DFS)算法来解决迷宫问题。
523 2