【C语言】汉罗塔

article/2025/6/16 8:26:13

前言
🎈大家好,我是何小侠🎈
🌀大家可以叫我**小何或者小侠🌀**
🔴我是一名普通的博客写作者🔴
💐希望能通过写博客加深自己对于学习内容的理解💐
🌸也能帮助更多人理解和学习🌸
🍃我的主页: 何小侠的主页🍃

在这里插入图片描述

在这里插入图片描述

                        今天是高考,高考加油!

    这篇博客我们一起来学习汉罗塔,或者说学习递归。希望这篇博客能帮助大家理解和学习

    引子🍊

    在印度,有这么一个古老的传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片,一次只移动一片,不管在哪根针上,小片必在大片上面。当所有的金片都从梵天穿好的那根针上移到另外一概针上时,世界就将在一声霹雳中消灭,梵塔、庙宇和众生都将同归于尽

    汉罗塔解析🍊

    我们先来看一个gif
    在这里插入图片描述
    这里有三个柱子,我们从左至右称为A柱,B柱,C柱。
    我们先从一个圆盘开始分析
    ru在这里插入图片描述
    如果只有一个柱子我们就只需要把柱子从A——>C就行了。
    然后我们再来看看有两个圆盘呢?
    在这里插入图片描述
    我们看到我们先讲小圆盘移动到B柱,再把大圆盘移动到C柱,然后再将小圆盘移动到C柱。
    再加一个圆盘会是什么样?我们已经快接近规律了。
    在这里插入图片描述
    这个过程就逐渐变复杂起来了,由于我们已经试出了三种情况,我们可以大胆猜测汉罗塔的规律。

    • 当只有一个盘移动1次。
    • 有两个盘移动3次
    • 当有三个盘就移动7次
      (2 ^ n)-1
      如果我回顾到引子部分,n = 64 ,假设每个盘子的移动需要1秒那么就需要2^64 -1秒,假设一个人能活到80岁那么也只能活2522880000(25亿秒)秒,愚公移山可能都没这和尚这么绝望吧。

    递归思路🍊

    我们从上面其实还可以发现一个规律,如果有n个圆盘,我们其实只需要

    • 将n-1个柱子借助C柱移动到B柱,
    • 然后将最后一个盘子(也就是n盘)移动到C柱,
    • 最后再将n-1个圆盘借助A柱从B柱移动到C柱就行了。

    这个过程分析是很简单的,但是要接受递归的这种思维是很难的,我最开始也不是很相信递归,但是递归见的多了后就更相信了。

    代码🍊

    #include<stdio.h>
    int count = 0;
    void HannoTower(char A, char B, char C, int n)
    {count++;if (1 == n){printf("把第%d个盘子从%c柱---->%c柱\n",n,A,C);}else{HannoTower(A, C, B, n - 1);//借助C柱从A柱将n-1个盘子移动到B柱printf("把第%d个盘子从%c柱---->%c柱\n",n, A, C);//将最后一个盘子移动到C柱HannoTower(B, A, C, n-1);//借助A柱从B柱将n-1个盘子移动到C柱}
    }int main()
    {int n = 0;printf("请输入你想要和尚搬多少个盘子\n");scanf("%d", &n);HannoTower('A', 'B', 'C', n);printf("和尚搬了%d次", count);return 0;
    }
    

    我记得我刚遇到这个题目时也没有任何思路,一直在想用什么来表示柱子,后来看到别人的代码也还是不能算很懂为什么字符A,B,C就能直接表示柱子。
    但是实际上我们也只需要操作一些数字和字符就够了。
    A、B、C,3个字符为抽象成的3个柱子。三个柱子中必定是有一个辅助移动柱的,在函数参数中把放在中间的当作辅助柱才行。这个代码如果你仔细去写出过程其实是比较麻烦的,因为我最近也没有太多时间所以我就不在这里实现了,我之前有看到有个同学写出来过,还是比较麻烦的。

    总结🍊

    这篇博客我们系统的介绍了汉诺塔的实现,有没有对递归有感觉了呢?如果没有再多练习就行了!。

    最后如果这篇博客有帮助到你,欢迎点赞关注加收藏

    在这里插入图片描述在这里插入图片描述
    如果本文有任何错误或者有疑点欢迎在评论区评论
    在这里插入图片描述

    在这里插入图片描述


    http://chatgpt.dhexx.cn/article/xcoGhi0l.shtml

    相关文章

    [C语言]C语言解决汉罗塔问题(初学者版)

    目录 1、汉罗塔问题解决思路&#xff1a; 2、代码实现&#xff1a; 函数部分&#xff1a; 全部代码&#xff1a; 运行结果&#xff1a; 3、结语&#xff1a; 1、汉罗塔问题解决思路&#xff1a; 以三个为例&#xff0c;步骤为&#xff1a; 1.首先我们需要将其分成两个整体…

    汉诺塔问题的详细讲解(python版)

    2022.3.17 2022.11.15 增加次数计算一&#xff0e;抽象为数学问题&#xff1a; 从左到右有A、B、C三根柱子&#xff0c;其中A柱子上面有从小叠到大的n个圆盘&#xff0c;现要求将A柱子上的圆盘移到C柱子上去&#xff0c;期间只有一个原则&#xff1a;一次只能移到一个盘子且大…

    Golang 汉罗塔问题

    先用一般方法实现汉罗塔方法: 先确定三个"石柱" A B C 。n代表A柱起始圆盘数量 主函数: 结合栈来实现汉罗塔。 因为栈先进后出的特点 很适合汉罗塔。其实和上述方法本质一样,只不过添加了 栈的特性 这里定的栈最大容量为7,可以根据实际情况更改 栈的构造&#xff…

    汉罗塔(递归分治)

    Java代码如下 public class Hanoi {//操作步骤数private static int steps 1;public static void main(String[] args) {//盘子数目int diskNumber 4;doTowers(diskNumber, A, B, C);}private static void doTowers(int diskNum, char from , char via, char to){if (diskNum…

    汉诺塔(Hanoi)问题,Java实现,C语言实现,Python实现!!!

    目录 一、汉诺塔的玩法 二、汉诺塔的逻辑 三、代码实现 四、运行结果 五、总结 一、汉诺塔的玩法 汉诺塔&#xff08;Tower of Hanoi&#xff09;&#xff0c;又称河内塔&#xff0c;是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子&#x…

    Java基础语法(汉罗塔)

    Java基础语法&#xff08;汉罗塔&#xff09; 1 起源2 需求3 分析3.1 1个碟子3.2 2个碟子3.3 3个碟子3.4 4个碟子3.5 规律 4 代码实现&#xff1a;直接算法5 代码实现封装&#xff1a;栈的思想 1 起源 汉罗塔&#xff08;又称河内塔&#xff09;问题是源于印度一个古老传说的益…

    《经典递归问题:汉罗塔》

    &#x1f320;作者&#xff1a;TheMythWS. &#x1f386;专栏&#xff1a;《JavaSE》 &#x1f387;座右铭&#xff1a;不走心的努力都是在敷衍自己&#xff0c;让自己所做的选择&#xff0c;熠熠发光。 目录 ✨汉罗塔的介绍 图解游戏​ ✨N层汉罗塔需移动的次数 ✨汉罗塔的…

    数据链路层 功能概述

    数据链路层的研究思想 数据链路层基本概念 数据链路层功能概述 数据链路层功能概述

    数据链路层功能概述、封装成帧与透明传输

    你一定要做自己&#xff0c;做自己喜欢的事&#xff0c;然后把自己交给命运 文章目录 本章启航思维导图数据链路层数据链路层基本概念数据链路层功能概述封装成帧透明传输组帧的四种方法字符计数法字符填充法零比特填充法违规编码法 本章启航思维导图 数据链路层 数据链路层基…

    【计算机网络】数据链路层——数据链路层功能/组帧/差错控制

    文章目录 数据链路层数据链路层的功能为网络层提供服务链路管理帧定界、帧同步与透明传输流量控制 组帧字符计数法字符填充的首尾定界符法零比特填充的首尾标志法违规编码法 差错控制检错编码奇偶校验码循环冗余码 纠错编码 数据链路层 数据链路层的功能 数据链路层在物理层提…

    19数据链路层的功能

    1、数据链路层的功能 数据链路层在物理层提供服务的基础上向网络层提供服务&#xff0c;其主要作用是加强物理层传输原始比特流的功能&#xff0c;将物理层提供的可能出错的物理连接改造成逻辑上无差错的数据链路&#xff0c;使之对网络层表现为一条无差错的链路。 2、为网络层…

    计算机网络——数据链路层功能概述、封装成帧、差错控制、流量控制与可靠传输机制

    文章目录 前言一、数据链路层功能概述二、封装成帧1、透明传输2、封装成帧3、组帧的方法⑴字符计数法⑵字符/节填充法⑶零比特填充法⑷违规编码法 三、差错控制1、差错由来2、检错编码⑴奇偶校验码⑵循环冗余码 3、纠错编码——海明码 四、流量控制与可靠传输机制1、停止等待协…

    计算机网络【数据链路层的功能】

    计算机网络【数据链路层的功能】 数据链路层基本概念数据链路层功能概述封装成帧透明传输字符计数法字符填充法零比特填充法 差错控制差错从何而来&#xff1f;CRC 循环冗余码 数据链路层基本概念 数据链路层使用的信道主要有一下两种类型&#xff1a; 点对点信道&#xff1a…

    数据链路层主要功能

    透明传输 个人理解&#xff0c;透明传输其实就是指无论是什么报文都可以传输&#xff0c;非透明传输就是指某些特殊字符不能传输&#xff0c;在计算机网络中&#xff0c;透明传输在数据链路层提到过&#xff0c;在数据链路层将网络层协议封装成帧时&#xff0c;会在首部和尾部分…

    数据链路层(内容超多哦)

    数据链路层——交换机 1. 数据链路概述2. 以太网2.1 以太网帧格式2.2 交换机设备简介2.3 交换机的工作原理2.4 交换机以太网的工作模式2.5 配置前的准备 3. 命令行的使用 1. 数据链路概述 数据链路层的功能&#xff1a;1.数据链路的建立、维护与拆除 2.帧包装、帧传输、帧同步…

    计算机网络:数据链路层功能

    文章目录 1.为网络层提供服务2.链路管理3.帧定界、帧同步与透明传输4.流量控制5.差错控制 数据链路层在物理层提供服务的基础上向网络层提供服务&#xff0c;其主要作用是加强物理层传输原始比特流的功能&#xff0c;将物理层提供的可能出错的物理连接改造为逻辑上无差错的数据…

    计算机网络-数据链路层功能概述

    数据链路层的研究思想 基本概念 结点: 主机, 路由器 链路: 网络中两个结点之间的物理通道, 链路的传输介质主要有双绞线, 光纤 和微波, 分为有线链路和无线链路 数据链路: 网络中两个结点的逻辑通道, 把现实控制数据传输协议的硬件和软件加到链路上就构成了数据链路 帧: 链…

    第三章:数据链路层(一)

    数据链路层基本概念 结点:主机、路由器 链路:网络中两个结点之间的物理通道&#xff0c;链路的传输介质主要有双绞线、光纤和微波。分为有线链路、无线链路。 数据链路&#xff1a;网络中两个结点之间的逻辑通道&#xff0c;把实现控制数据传输协议的硬件和软件加到链路上就构…

    随机信号的特征—(自相关函数\互相关函数、协方差矩阵、相关矩阵\相关系数矩阵\相关系数)

    在学习概率统计之前&#xff0c;我学习的都是确定的函数。概率统计讨论了一次取值时获得的值是不确定的&#xff0c;而随机过程讨论了不确定会发生哪个时间函数。 每个x(t)函数(样本函数)就是实际发生的一个表达式确定的函数&#xff0c;对每个x(t)的处理&#xff0c;都是与之…

    使用 VPN 你一定要了解这几个真相!

    关注公众号&#xff0c;回复“1024”获取2TB学习资源&#xff01; 什么是 VPN&#xff1f; VPN 是一种隐藏您的Internet 协议 (IP) 地址的服务。这使您可以匿名浏览互联网&#xff0c;因为没有人可以将您的数据链接到您的IP地址。 要了解VPN的作用&#xff0c;您只需分解“虚拟…