汉诺塔问题(递归版)

简介: 汉诺塔问题(递归版)

在这里插入图片描述

@TOC

一、前言

汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。

:point_right::point_right::point_right: 点我即玩,为了更好的理解汉诺塔,大家可以先体验一下

二、问题刨析(详解)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

:snowflake::snowflake::snowflake:给大家用图片的形式展示了一下汉诺塔的基本流程,说白了,就是一块板上有三根针 A、B、C。 A 针上套有 64 个大小不等的圆盘,按照大的在下、小的在上的顺序排列,要把这 64 个圆盘从 A 针移动到 C 针上,每次只能移动一个圆盘,移动过程可以借助 B 针。

三、移动次数

==设想一下,移动64个汉诺塔需要多少次== 据统计,移动64个汉诺塔可能需要几百年,那么我们想要解决汉诺塔问题,该如何使用递归解决了,请看下文:
塔数 步数
1 1
2 3
3 7
4 15
... ...
64 2^64-1
:sunny::sunny::sunny:列举了几组数据之后,可以发现每次移动的次数都是2^n-1,所以移动次数代码实现如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int F(int n) {
    if (1 == n)
        return 1;
    else return 2 * F(n - 1) + 1;
}
int main() {
    int n = 0;//n为汉诺塔的层数
    scanf("%d", &n);
    int ret = F(n);
    printf("%d", ret);
    return 0;
}

四、移动步骤

如果只有一个汉诺塔,那么直接从A->C

在这里插入图片描述

如果有两个汉诺塔,即A->B,A->C,B->C三步
在这里插入图片描述

在这里插入图片描述

当汉诺塔数量增多时,列举已经变得十分繁琐,下面直接由递归代码实现
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
void Hanio_Step(int n, char A, char B, char C)
{
    if (1 == n) //当只有一个一个塔时,直接    A->C
        printf("%c->%c", A, C);
    else   //当塔的数量大于1时,用递归实现
    {
        Hanio_Step(n-1, A, C, B);  //先将A上面的n-1个,借助C,移动到B上
        printf("%c->%c ", A, C);    //剩余1个直接A->C
        Hanio_Step(n-1, B, A, C);  //再将B上面的n-1个,借助A,移动到C上重复循环
    }
}
int main()
{
    int n = 0;
    scanf("%d", &n);//输入汉诺塔的个数
    Hanio_Step(n, 'A', 'B', 'C');//用字符A,B,C分别代表三个柱子
    return 0;
}

在这里插入图片描述

总结

相信看到这里的小伙伴对汉诺塔的问题已经有了一定的认识。如果大家感到对自己有帮助的话,记得三连哦,笔芯:heartpulse::heartpulse::heartpulse:

在这里插入图片描述

目录
相关文章
|
8月前
|
人工智能 小程序 数据安全/隐私保护
如何免费生成文件二维码
草料二维码的文件二维码,免费即可生成,不限存储空间,二维码长期有效,生码个数和扫描次数都没有限制
|
开发框架 小程序 JavaScript
UniApp框架适合哪些应用场景?
UniApp作为一款跨平台的移动应用开发框架,因其高效、灵活和强大的特性,适用于多种应用场景。
617 3
|
12月前
|
人工智能 弹性计算 数据可视化
通过ROS低代码CADT无代码和可视化能力管理云上基础设施
本次主题介绍通过ROS低代码CADT无代码和可视化能力管理云上基础设施。首先探讨了云上部署的挑战,如手动部署耗时、缺乏一致性等。接着介绍了阿里云资源编排(ROS)的核心能力,包括资源栈模板和Terraform托管,简化多地域、多账号的自动化部署。重点展示了ROS的可视化编译器,用户无需编写IaC模板,可通过拖拽资源、配置属性实现一键部署。最后讨论了如何利用生成式人工智能开发IaC模板,提升架构设计效率。通过这些工具,可以显著提高云上架构的构建和管理效率,降低学习成本,并确保一致性和标准化。
|
安全 网络安全 数据安全/隐私保护
|
数据库 数据安全/隐私保护
Failed to load resource: the server responded with a status of 404 ()出错的原因是,因为自己调试的时候,设置了与宝塔不一样的数据库
Failed to load resource: the server responded with a status of 404 ()出错的原因是,因为自己调试的时候,设置了与宝塔不一样的数据库
|
机器学习/深度学习 人工智能 自然语言处理
大模型的特点、重要概念及工作方式详解
大模型是具有大量参数和复杂结构的深度学习模型,通过处理大量数据实现高效任务解决。其特点包括参数规模庞大、深层网络结构、预训练与微调、多任务学习和自适应能力。重要概念有注意力机制、Transformer架构、迁移学习和分布式训练。大模型的工作方式包括输入处理、特征提取、预测与损失计算、反向传播与优化,以及评估与微调。这些特性使其在自然语言处理、计算机视觉等领域取得显著进展。
4480 0
|
自然语言处理 达摩院 索引
Elasticsearch 中文分词器
在使用Elasticsearch 进行搜索中文时,Elasticsearch 内置的分词器会将所有的汉字切分为单个字,对用国内习惯的一些形容词、常见名字等则无法优雅的处理,此时就需要用到一些开源的分词器,以下分别介绍几种常见的中文分词器
10614 2
Elasticsearch 中文分词器
|
算法
简记二分算法模板与代码案例:整数二分和浮点数二分
本文介绍了两种算法模板,分别是整数二分和浮点数二分。
268 0
|
安全 API
api漏洞系列-邮箱验证API接口无限制,可作为邮箱炸弹
漏洞描述 https://admin.phacility.com/settings/user/toma/page/email/ 中的API接口是无限的,可以用作邮箱炸弹。
651 4
api漏洞系列-邮箱验证API接口无限制,可作为邮箱炸弹