【汉诺塔】经典递归问题(Java实现)图文并茂讲解

在这里插入图片描述

📚博客主页:爱敲代码的小杨.

✨专栏:《Java SE语法》

❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️
🙏小杨水平有限,欢迎各位大佬指点,相互学习进步!

文章目录

  • 1. 什么是汉诺塔
  • 2. 问题分析

1. 什么是汉诺塔

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

2. 问题分析

首先我们假设三根柱子为A(起始柱子),B(中转柱子),C(结束柱子);有N个圆盘。

  1. N = 1时,就只需要移动1次,即A->C

  1. N = 2时,就需要移动是3次:即A->B A->CB->C

    1705575637002

  2. N = 3,就需要移动7次,A->CA->BC->BA->CB->AB->CA->C

    1705577109653

以此类推:移动次数 = 2 ^ 圆盘个数 - 1

所以若有64个圆盘那将会移动 2 ^ 64 - 1次(即:18,446,744,073,709,551,615‬次),若每次移动需要1s时间,则需要将近5849亿年的时间才能够做到。可见大梵天有多恨婆罗门,这绝对是在坑人啊!!

综上我们可以将问题分解为以下三个步骤:

  1. 将A柱上的n-1个盘子移动到B柱上
  2. 将A柱上剩下的一个盘子移动到C柱上。
  3. 将B柱上的n-1个盘子移动到C柱上。

通过递归地执行这三个步骤,我们最终可以实现将所有盘子从A柱移动到C柱的目标。

【注意事项】

  1. 递归的终止条件:当只有一个盘子时,可以直接将其从A柱移动到C柱,此时递归终止。
  2. 递归的分解:将问题分解为三个步骤,每次递归调用都是为了完成这三个步骤中的一个。
  3. 递归的回溯:在完成一个递归调用后,需要将问题状态恢复到递归调用前的状态,以便进行下一个递归调用。
  4. 递归的效率:汉诺塔问题的递归解法时间复杂度为O(2^n),其中n表示盘子的数量。因此,当盘子数量较大时,递归解法的时间复杂度会非常高。

动画演示:

1705578024283

代码:

public class Test6 {public static void main(String[] args) {hanoi(3, 'A', 'B','C');}/*** 将盘子从pos1移动到pos2* @param pos1 起始柱子* @param pos2 结束柱子*/public static void move(char pos1, char pos2){System.out.print(pos1 + "->" + pos2 + " ");}/**** @param n 盘子个数* @param pos1 起始柱子* @param pos2 中转柱子* @param pos3 目标柱子*/public static void hanoi(int n, char pos1, char pos2, char pos3){if (n == 1){move(pos1, pos3);return;} else{hanoi(n-1, pos1, pos3, pos2);move(pos1, pos3);hanoi(n-1, pos2, pos1, pos3);}}
}

运行结果:

image-20240114143655848

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/414753.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

司铭宇老师:房地产销售新人培训:房地产销售知识

房地产销售新人培训:房地产销售知识 1.客户沟通与谈判技巧 (1)倾听与理解客户需求 (2)善于运用FABE法则说服客户 (3)把握谈判节奏,掌握谈判主动权 (4)应…

数学建模美赛资料(赛题+获奖论文更新)

数学建模美赛历年真题可以帮助我们了解比赛的出题思路,对建模比赛有一个大致的了解。 在备赛过程中,通过往年真题,我们可以了解考试的范围和重点,做到心中有数,可以有的放矢。通过真题,我们可以感受到各个…

神经网络学习

什么是神经网络 逻辑回归、感知机均只包含一个输入层以及一个输出层,只能处理线性可分问题。如果在输入层与输出层之间加入一层到多层的隐藏层,就会得到神经网络结构。 神经网络一般由输入层、隐藏层、输出层构成,下图展示了其一般结构: 隐藏层之所称之为隐藏层,是因为在…

matlab Robotics Toolbox

工具箱下载地址:ROBOTICS TOOLBOX 安装教程 笛卡尔运动规划 在MATLAB中,ctraj和jtraj是两个不同的函数,主要用于控制系统和机器人学中的轨迹规划。它们之间的主要区别在于它们处理的问题类型和使用方式。 ctraj(连续时间轨迹规划…

【gradle使用本地文件】

@[TPC](Gradle 使用本地文件) # distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-all.zip distributionUrl=file\:/D:/soft/gradle/gradle-7.4.2-all.zip欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学…

ElasticSearch的常用增删改查DSL和代码

es增删改查常用语法 我们日常开发中,操作数据库写sql倒是不可能忘记,但是操作es的dsl语句有时候很容易忘记,特地记录一下方便查找。 DSL语句 1、创建索引 -- 创建索引 PUT /my_index {"mappings": {"properties": {&…

表的增删改查CURD(基础)

🎥 个人主页:Dikz12🔥个人专栏:MySql📕格言:那些在暗处执拗生长的花,终有一日会馥郁传香欢迎大家👍点赞✍评论⭐收藏 目录 新增(Create) 全列插入 指定列…

2023年移远车载全面开花,智能座舱加速进击

作为汽车智能化的关键组件,车载模组正发挥着越来越重要的作用。 移远通信进入车载模组领域近十年,已形成了完善的车载产品队列,不但在5G/4G车载通信、智能座舱、C-V2X车路协同等领域打造了一枝独秀的产品线,也推出了车规级Wi-Fi/蓝…

VTK读取文件时显示无法找到(如.stl not found)解决方案

问题&#xff1a; //读取模型文件vtkSmartPointer<vtkSTLReader> obj vtkSmartPointer<vtkSTLReader>::New();obj->SetFileName("D:\ct\20201102113826651_3d\pelvis.stl"); 在VTK项目运行读取模型文件的代码时&#xff0c;出现以下问题&#xff1a…

自我控制能力测试

自我控制能力CN量表来源于mmpi量表中的附加量表&#xff0c;原量表为精神疾病的辅助分析和鉴定&#xff0c;也可以用于做为职业分析&#xff0c;如企业人才选拔&#xff0c;人岗匹配。 自我控制能力&#xff0c;也叫自控力&#xff0c;是克制冲动的能力&#xff0c;是理性的判…

适用于电脑的 10 款最佳文件恢复软件

由于在线可用选项数量众多&#xff0c;寻找适用于 Windows 11 的最佳文件恢复软件可能会很棘手&#xff0c;但本指南将为您提供有关此主题所需的所有信息。 文件或数据丢失是指意外或无意丢失电子设备上存储的重要数字文件的事件。这可能是由于外部或内部问题造成的&#xff0…

Neo4j安装与配置以及JDK安装与配置教程(超详细)

Win11 JDK17 Neo4j5.15 由于Neo4j是基于Java的图形数据库&#xff0c;运行Neo4j需要启动JVM进程&#xff0c;因此必须安装JAVA SE的JDK。配置 JDK环境&#xff0c;为以后能适应Springboot&#xff0c;请选择最低JDK1.8的环境。 JDK下、安、配 1.JDK下载 JDK下载地址&…