Java基础语法(汉罗塔)

article/2025/6/16 8:05:53

Java基础语法(汉罗塔)

  • 1 起源
  • 2 需求
  • 3 分析
    • 3.1 1个碟子
    • 3.2 2个碟子
    • 3.3 3个碟子
    • 3.4 4个碟子
    • 3.5 规律
  • 4 代码实现:直接算法
  • 5 代码实现封装:栈的思想

1 起源

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

2 需求

将汉罗塔问题抽象到数学:

  • 1.有三根杆子 A,B,C;
  • 2.A 杆上有若干大小不同的碟子,从上往下越来越大;
  • 3.每次移动一块碟子,小的只能叠在大的上面;
  • 4.把所有碟子从 A 杆全部移到 C 杆上。

在这里插入图片描述

3 分析

  • 确定 A 柱子上的初始碟子:int disks = 3;
  • 确定三个容器 char ‘A’、char ‘B’、char ‘C’;
  • 初始确定移动方法,从 from --> to:hanrotaMove(int disks, char from, char index, char to)。

3.1 1个碟子

A 柱子上只有一个碟子时,直接移动到 C:

numfromindextomv
1ABCA–>C

3.2 2个碟子

numfromindextomv
1ACBA–>B
2ABCA–>C
1BACB–>C

3.3 3个碟子

numfromindextomv
1ABCA–>C
2ACBA–>B
1CABC–>B
3ABCA–>C
1BCAB–>A
2BACB–>C
1ABCA–>C

3.4 4个碟子

numfromindextomv
1ACBA–>B
2ABCA–>C
1BACB–>C
3ACBA–>B
1CBAC–>A
2CABC–>B
1ACBA–>B
4ABCA–>C
1BACB–>C
2BCAB–>A
1CBAC–>A
3BACB–>C
1ACBA–>B
2ABCA–>C
1BACB–>C

3.5 规律

在上述前 4个下不难发现有规律存在:
A 柱子上有 n 个碟子,移动步骤便以 n 分为上下两部分,且上部分移动的数与下部分移动的数相同,此处便有递归分治的思想,解析 4 个碟子:
hanrotaMove(int disks, char from, char index, char to)
在初始入参:from ‘A’ - index ‘B’ - to ‘C’ 下,每一级都做为下一级分支的入参,且每个分支的上部都有相同的步骤“换”:from-to-index,每个分支的下部也都有相同的步骤“换”:index-from-to,可将此图看为完全二叉树。

4 代码实现:直接算法

代码常规实现:Hanrota.java

/*** @author zc* @date 2021/10/29 9:30* 汉罗塔*      1.有三根杆子 A,B,C;*      2.A 杆上有若干大小不同的碟子,从上往下越来越大;*      2.每次移动一块碟子,小的只能叠在大的上面;*      3.把所有碟子从 A 杆全部移到 C 杆上。*      * main(String[] args):主方法,主程序入口;* hanrotaMove(int disks, char from, char index, char to):方法,汉罗塔移动*/
public class Hanrota {/*** 主程序入口* @param args 系统参数*/public static void main(String[] args) {// 初始化一个 A 柱子上碟子数int disks = 4;hanrotaMove(disks, 'A', 'B', 'C');}/*** 汉罗塔移动* @param disks 待移动碟子数量* @param from 起始点* @param index 过渡点* @param to 目标点*/public static void hanrotaMove(int disks, char from, char index, char to){if (disks <= 0){System.out.println("碟子数量不足");} else if (disks == 1) {System.out.println("Disk " + disks + " from " + from + " to " + to);} else {// 递归上部分hanrotaMove(disks - 1, from, to, index);// 中间分隔点System.out.println("Disk " + disks + " from " + from + " to " + to);// 递归下部分hanrotaMove(disks - 1, index, from, to);}}
}

运行结果:

Disk 1 from A to B
Disk 2 from A to C
Disk 1 from B to C
Disk 3 from A to B
Disk 1 from C to A
Disk 2 from C to B
Disk 1 from A to B
Disk 4 from A to C
Disk 1 from B to C
Disk 2 from B to A
Disk 1 from C to A
Disk 3 from B to C
Disk 1 from A to B
Disk 2 from A to C
Disk 1 from B to C

5 代码实现封装:栈的思想

汉罗塔的移动存储很像栈的思想:先进后出

就是在上一步的代码实现:直接算法上封装一下。

首先要 java 实现一个栈,再递归分治解决汉罗塔移动:MyStack.java

package com;/*** @author zc* @date 2021/10/29 11:13* 栈:MyStack** main(String[] args):主方法,主程序入口* MyStack(int s):有参构造,初始化栈容器的大小* push(long j):方法,入栈* pop():方法,出栈* peek():方法,获取栈顶值* isEmpty():方法,判断栈是否为空* isFull():方法,判断栈是否存储满* size():方法,获取当前栈中元数存储个数* hanrotaMove(int disks, MyStack A, MyStack B, MyStack C):方法,汉罗塔移动*/
public class MyStack {/*** 属性 maxSize:初始化栈的容器大小*/private int maxSize;/*** 属性 stackArray:栈中数据存储*/private long[] stackArray;/*** 属性 top:标志栈中最上一个元素值*/private int top;/*** 有参构造,初始化栈容器的大小* @param s 栈容器大小*/public MyStack(int s) {maxSize = s;stackArray = new long[maxSize];top = -1;}/*** 入栈* @param j 入栈的元素*/public void push(long j) {stackArray[++top] = j;}/*** 出栈* @return 返回出栈的元素*/public long pop() {return stackArray[top--];}/*** 获取栈中最上一个值* @return 返回栈顶值*/public long peek() {return stackArray[top];}/*** 判断栈是否为空* @return 返回状态为空 true,否则 false*/public boolean isEmpty() {return (top == -1);}/*** 判断栈是否存储满* @return 返回状态已满 true,否则 false*/public boolean isFull() {return (top == maxSize - 1);}/*** 求栈中当前存储元数个数* @return 返回当前存储元数个数*/public int size(){return top + 1;}/*** 主程序入口* @param args 系统参数*/public static void main(String[] args) {// 初始化栈空间int topN = 3;// 初始化 A 栈空间MyStack A = new MyStack(topN);// 初始化 B 栈空间MyStack B = new MyStack(topN);// 初始化 C 栈空间MyStack C = new MyStack(topN);// 给 A 栈添加汉罗塔数A.push(13);A.push(9);A.push(4);// 汉罗塔移动hanrotaMove(A.size(),A,B,C);// 打印 C 栈元素while (!C.isEmpty()){System.out.print(C.pop() + " ");}}/*** 汉罗塔移动* @param A A 柱子* @param B B 柱子* @param C C 柱子*/public static void hanrotaMove(int disks, MyStack A, MyStack B, MyStack C){if (disks <= 0){System.out.println("A 柱子上没有数据");} else if (disks == 1) {// A 中出栈long value = A.pop();System.out.println("Disk " + value + " from " + A + " to " + C);// C 中入栈C.push(value);} else {// 递归上部hanrotaMove(disks - 1, A, C, B);// A 中出栈long value = A.pop();System.out.println("Disk " + value + " from " + A + " to " + C);// C 中入栈C.push(value);// 递归下部hanrotaMove(disks - 1, B, A, C);}}
}

运行结果:

Disk 4 from com.MyStack@74a14482 to com.MyStack@1540e19d
Disk 9 from com.MyStack@74a14482 to com.MyStack@677327b6
Disk 4 from com.MyStack@1540e19d to com.MyStack@677327b6
Disk 13 from com.MyStack@74a14482 to com.MyStack@1540e19d
Disk 4 from com.MyStack@677327b6 to com.MyStack@74a14482
Disk 9 from com.MyStack@677327b6 to com.MyStack@1540e19d
Disk 4 from com.MyStack@74a14482 to com.MyStack@1540e19d
4 9 13 

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

相关文章

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

&#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 处理器是开发互联和 …

Semi-prime H-numbers

UVA11105 线性筛即可。 #include <iostream> #include <algorithm> #include <cmath> #include <vector> using namespace std;const int MAXN 1000001;bool IsNotHPrimer[MAXN 1];bool IsSemiHPrimer[MAXN 1];int sum[MAXN 1];vector<int>…