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

article/2025/6/16 8:51:09

目录

一、汉诺塔的玩法

二、汉诺塔的逻辑

三、代码实现

四、运行结果 

五、总结 


一、汉诺塔的玩法

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

二、汉诺塔的逻辑

        现将三个柱子分别记为A起始位置、B中转位置、C目标位置。n表示圆盘的个数。

1、当汉罗塔层数n为1层时(如下图)

        当汉诺塔的层数为1时很简单,直接从起始位置A到目标位置C。

第1次:A---->C

2、当汉罗塔层数n为2层时(如下图)

        思考一下2个圆盘时的移动步骤,也很简单。总共需要3步:第1步,把小圆盘从A移到B;第二步,把大圆盘从A移到C;第三步,把小圆盘从B移到C。

第1次:A---->B

第2次:A---->C  

第3次:B---->C

3、当汉诺塔层数n为3层时(如下图)

        我们来思考一下,要想把3个圆盘从A移到C,首先需要把3号上面的圆盘1和2移到B,这样3号才能直接到C。

        关键点是,我们把1、2两个圆盘移到B,不就是我们之前讨论的2个圆盘的情况吗?只不过之前的目标是从A移到C,现在是从A移到B,同样是2个空着的杆子,仅仅是编号有差别,本质没有任何区别!

        理解了上面所讲的内容,我们的思路就变得很明白了。3个圆盘同样可以认为是3大步:第1步,把1和2移到B;第2步,把3移到C;第3步,把1和2从B移到C。而其中1和2如何移到B或者C,就是我们之前讨论的2个圆盘的情况了,这也就是递归的思想。

 ​4、 当汉诺塔层数为n时(如下图) 

        目前A上有n个圆盘,我们要把它们移到C上。这个其实也只需要3步:第1步,把A中从1到n-1个圆盘移到B;第2步,把A中剩下的第n个圆盘移到C;第3步,把B中的n-1个圆盘移到C。至于如何把n-1个圆盘移到B,那就相当于重复我们上面的步骤,直到递归到我们熟悉的2个或3个圆盘所需的移动步骤。

三、代码实现

1、Java代码实现

import java.util.Scanner;
public class Hanoi{//定义移动的次数,初值为0static int count=0;//A-起始位置//B-中转位置//C-目标位置public static void hanoi(int n,String A,String B,String C){//判断层数n是否小于1,小于1则报错if(n<1){System.out.println("请输入大于等于1的整数!");//判断层数n是否等于1,等于1则1次就移动完毕}else if(n==1){count++;System.out.println("第"+count+"次:"+A+"---->"+C);//当层数n大于1时执行下面的操作}else {//将n-1个盘子从A通过C移到Bhanoi(n-1,A,C,B);//移动次数加1count++;System.out.println("第"+count+"次:"+A+"---->"+C);//将n-1个盘子从B通过A移到Chanoi(n-1,B,A,C);}}public static void main(String[] args) {Scanner sc=new Scanner(System.in);System.out.println("请输入汉诺塔的层数:");int n=sc.nextInt();hanoi(n,"A","B","C");}
}

2、C语言实现

#include <stdio.h>
//定义移动的次数,初值为0
static int count = 0;
// A-起始位置
// B-中转位置
// C-目标位置
void hanoi(int n, char A, char B, char C)
{//判断层数n是否小于1,小于1则报错if (n < 1){printf("请输入大于等于1的整数!");}//判断层数n是否等于1,等于1则1次就移动完毕else if (n == 1){count++;printf("第%d次:%c---->%c\n", count, A, C);}//当层数n大于1时执行下面的操作else{//将n-1个盘子从A通过C移到Bhanoi(n - 1, A, C, B);//移动次数加1count++;printf("第%d次:%c---->%c\n", count, A, C);//将n-1个盘子从B通过A移到Chanoi(n - 1, B, A, C);}
}
void main()
{int n;printf("请输入汉诺塔的层数:\n");scanf("%d", &n);hanoi(n, 'A', 'B', 'C');
}

3、Python实现 

//因为python不支持静态变量,所以我引入类,然后调用这个类的变量
class MyStatic:count=0
def hanoi(n,A,B,C):if n<1:print("请输入大于等于1的整数!")elif n==1://移动次数加1MyStatic.count+=1print("第",MyStatic.count,"次:",A,"---->",C)else://将n-1个盘子从A通过C移到Bhanoi(n-1,A,C,B)//移动次数加1MyStatic.count+=1print("第",MyStatic.count,"次:",A,"---->",C)//将n-1个盘子从B通过A移到Chanoi(n-1,B,A,C)
n=eval(input("请输入汉诺塔的层数:\n"))
hanoi(n,'A','B','C')
count = 0
def hanoi(n, A, B, C):global countif n < 1:print("请输入大于等于1的整数!")elif n == 1:count += 1print("第{}次:{}---->{}".format(count, A, C))else:hanoi(n - 1, A, C, B)count += 1print("第{}次:{}---->{}".format(count, A, C))hanoi(n - 1, B, A, C)if __name__ == '__main__':n = int(input("请输入汉诺塔的层数:"))hanoi(n, "A", "B", "C")

四、运行结果 

五、总结 

        本文主要介绍了汉诺塔的玩法、逻辑、以及相关代码的实现。主要的思想是递归思想。本文也许还有许多不足的地方,欢迎各位大佬指点。若本文对你有所帮助,请支持我,给予我记录更多文章的动力。 感谢!


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

相关文章

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;您只需分解“虚拟…

苹果Mac电脑L2TP连接公司内部网络失败解决方案

苹果Mac电脑L2TP连接公司内部网络 苹果Mac电脑的L2TP连接公司内部网络失败是一种常见的问题&#xff0c;可能会导致用户无法访问公司内部资源。以下是一些可能的解决方案&#xff0c;可以尝试解决这个问题&#xff1a; 检查网络连接&#xff1a;首先要确保你的Mac电脑已经连接…

mac电脑升级Monterey12.1版之后L2TP连接公司内网后无法正常访问的问题解决

公司内网设置&#xff1a; L2TP&#xff0c;无共享密钥。 mac版本&#xff1a; macOS Monterey 版本12.6 审核人员看这里&#xff0c;文章中的VPN不是翻墙用的&#xff0c;是远程连接公司内网环境用的。 配置连接公司内容 1、系统偏好设置 → 网络&#xff1b; 2、点击左下角的…

传统网络安全设备-VPN介绍

前言 VPN设备介绍 定义 虚拟专用网络指的是在公用网络上建立专用网络的技术。之所以称为虚拟网主要是因为整个VPN网络的任意两个节点之间的连接并没有传统专网所需的端到端的物理链路&#xff0c;而是架构在公用网络服务商所提供的网络平台之上的逻辑网络&#xff0c;用户数…

US5M-ASEMI贴片快恢复二极管US5M

编辑&#xff1a;ll US5M-ASEMI贴片快恢复二极管US5M 型号&#xff1a;US5M 品牌&#xff1a;ASEMI 封装&#xff1a;SMC 电流&#xff1a;5A 电压&#xff1a;1000V 恢复时间&#xff1a;50ns 正向电压&#xff1a; 引脚数量&#xff1a;2 芯片个数&#xff1a;1 芯…

NXP/Freescale i.MX 计算机模块 - NXP i.MX 8Q、i.MX 6Q、i.MX 6D、i.MX 6DL、i.MX 6S、i.MX 6ULL、i.MX 7D 和 i.MX 7S

https://www.toradex.com/zh_cn/computer-on-modules/nxp-freescale-i.mx NXP/Freescale i.MX 计算机模块 NXP/Freescale i.MX 处理器是采用多核 ARM 的解决方案。Toradex 提供基于 NXP/Freescale i.MX 8、i.MX 6 和 i.MX 7 处理器的系统模块。 NXP i.MX 7 处理器是开发互联和 …