Algorithm:河内之塔

1. 说明

河内之塔(Towers of Hanoi)是法国人 M.Claus(Lucas)于1883年从泰国带至法国的,河内为越战时北越的首都,即现在的胡志明市;1883年法国数学家 Edouard Lucas 曾提及这个故事,据说创丗纪时 Benares 有一座波罗教塔,是由三支钻石棒(Pag)所支撑,开始时神在第一根棒上放置64个由上至下依由小至大排列的金盘(Disc),并命令僧侣将所有的金盘从第一根石棒移至第三根石棒,且搬运过程中遵守大盘子在小盘子之下的原则,若每日仅搬一个盘子,则当盘子全数搬运完毕之时,此塔将毁损,而也就是世界末日来临之时。

2. 解法

河内之塔是一个经典的递归问题。在这个问题中,目标是将所有盘子从起始棒(A)移动到目标棒(C),同时满足以下规则:
  • 每次只能移动一个盘子。
  • 不能将较大的盘子放在较小的盘子上。
  • 可以使用一个辅助棒(B)。

2.1 算法分析

  • 如果只有一个盘子,直接从A移动到C。
  • 如果有多个盘子:
总移动次数是:2^n - 1其中,n是盘子的数量。

2.2 C语言实现

#include <stdio.h> // 递归函数实现河内之塔 void hanoi(int n, char from, char to, char aux) { if (n == 1) { // 基本情况:只有一个盘子 printf("Move disk 1 from %c to %c\n", from, to); return; } // 将 n-1 个盘子从 from 移到 aux hanoi(n - 1, from, aux, to); // 将第 n 个盘子从 from 移到 to printf("Move disk %d from %c to %c\n", n, from, to); // 将 n-1 个盘子从 aux 移到 to hanoi(n - 1, aux, to, from); } int main() { int n; // 盘子的数量 printf("Enter the number of disks: "); scanf("%d", &n); printf("The sequence of moves:\n"); hanoi(n, 'A', 'C', 'B'); // A 是起点,C 是目标点,B 是辅助点 return 0; }

2.3 示例运行

输入盘子数量为3:
Enter the number of disks: 3 The sequence of moves: Move disk 1 from A to C Move disk 2 from A to B Move disk 1 from C to B Move disk 3 from A to C Move disk 1 from B to A Move disk 2 from B to C Move disk 1 from A to C

2.4 运行原理

以 n = 3 为例:
  • 将盘1和盘2移到辅助棒B:
  • 将盘3移到目标棒C。
  • 将盘1和盘2从辅助棒B移到目标棒C:
总共7次移动,符合公式 2^3 - 1 = 7,具体图示如下所示:

2.5 注意事项

  • 此代码适用于任何正整数的盘子数量,但盘子数量较大时,递归深度可能超过栈的限制。
  • 时间复杂度为 O(2^n),因此对大盘子数量的计算效率较低。

3. 附件

怎么判断”河内之塔“是个递归问题呢?

3.1 问题的分解特性

递归问题通常具有以下特征:一个大问题可以分解为若干个结构相似的子问题,且这些子问题的规模逐渐减小。我们可以把“河内之塔”问题这样分解,具体如下:
  • 要把所有盘子从A移动到C,首先需要将除了最大的盘子之外的盘子从A移动到B,然后将最大的盘子从A移动到C,最后将剩下的盘子从B移动到C。
  • 这个过程重复进行,直到只剩下一个盘子时,问题变得简单。

3.2 边界条件

递归算法需要明确的 基本情况(边界条件),也就是在递归中什么时候停止。
  • 在“河内之塔”中,当只有一个盘子时(即 n = 1),移动问题非常简单,直接将该盘子从起始棒移动到目标棒。

3.3 递归调用的结构

递归问题的关键是通过递归调用处理更小规模的子问题。在“河内之塔”中,问题的递归结构如下:
  • 将 n-1 个盘子从起始棒移动到辅助棒。
  • 将第 n 个盘子(即最大盘子)从起始棒移动到目标棒。
  • 将 n-1 个盘子从辅助棒移动到目标棒。
这种结构显然是递归的,因为它涉及到将一个较大的问题分解为两个相似的小问题,并通过递归方式处理这些小问题。

3.4 数学归纳法的验证

递归问题的一个常见特性是通过 数学归纳法证明其正确性。在“河内之塔”问题中,可以使用数学归纳法来证明:
  • 当 n = 1 时,移动一个盘子显然是正确的。
  • 假设对于 n = k 时,已经正确实现了将 k 个盘子从起始棒移动到目标棒。
  • 对于 n = k+1,我们可以将问题分解为两个部分:首先递归地将 k 个盘子从起始棒移动到辅助棒,然后将第 k+1 个盘子(最大盘子)从起始棒移动到目标棒,最后递归地将 k 个盘子从辅助棒移动到目标棒。
通过归纳法,我们可以确认这个过程适用于任意盘子的数量,证明了这是一个递归问题。

3.5 总结

判断“河内之塔”是递归问题的核心依据是:
  • 问题具有分解特性:大问题可以分解为更小的相同问题。
  • 存在明确的基本情况,当问题规模为1时可以直接求解。
  • 问题通过递归调用来逐步解决每个子问题,直到最小问题得到解决。
这些特点使得“河内之塔”可以非常自然地使用递归方法来解决。

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

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

相关文章

A109 PHP+MYSQL+LW+网上论坛网站 军事BBS系统的设计与实现 源码+文档 全套 教程

网上军事论坛网站系统 1.项目摘要2. 研究背景3.项目功能4.界面展示5.源码获取 1.项目摘要 随着计算机网络的普及&#xff0c;如今越来越多的论坛类网站也是数不胜数&#xff0c;各种类型的论坛交流网站&#xff0c;深受当前网友们的喜欢。网上军事论坛网站的成立&#xff0c;是…

【Nacos01】消息队列与微服务之Nacos 介绍和架构

Nacos Nacos 介绍和架构 什么是Nacos https://nacos.io/ https://github.com/alibaba/nacos Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称 是阿里巴巴开源的一个基于JAVA语言的更易于构建云原生应用的动态服务发现、配置管理和服务管理平台…

FolderMove 3.0 |文件夹安全转移,释放C盘空间

FolderMove v3.0是一款可以一键移动文件到其他磁盘的小工具。原版是全英文软件&#xff0c;但提供了汉化无限制版。软件体积小巧&#xff0c;只有约200KB&#xff0c;使用非常简单&#xff0c;无需安装&#xff0c;绿色环保。运行时选择需要移动的文件夹目录即可。FolderMove会…

TypeScript和JavaScript的区别

总结&#xff1a; TypeScript 是 JavaScript 的超集&#xff0c;它在 JavaScript 的基础上添加了强类型、接口、类、泛型等特性&#xff0c;并提供了静态类型检查等工具&#xff0c;让开发者能够在编写代码时更加安全、高效、可靠。与 JavaScript 相比&#xff0c;TypeScript …

学习threejs,使用VideoTexture实现视频Video更新纹理

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️VideoTexture 视频纹理 二、…

【PyTorch】回归问题代码实战

梯度下降法是优化算法中一种常用的技术&#xff0c;用于通过最小化损失函数来求解模型的最优参数。在线性回归中&#xff0c;目标是通过拟合数据来找到一条最适合的直线。梯度下降法通过迭代地调整模型参数&#xff0c;使得损失函数&#xff08;通常是均方误差&#xff09;最小…

Springboot入门教程系列HelloWorld

接下来学习Springboot相关的知识&#xff0c;从简单的入门到高级篇【也就是Springboot企业级快速开发的整合部分】&#xff0c;接下来的教程适合入门小白看&#xff0c;简单的说下入门级教程的环境准备 环境准备 jdk 1.8Maven:3.6.1springboot: 2.2.7 目前springboot最新版本为…

koa中间件

文章目录 1. koa中间件简介2. 中间件类型1. 应用级中间件2. 路由级中间件3. 错误处理中间件4. 第三方中间件 3.中间件执行流程 1. koa中间件简介 在Koa中&#xff0c;中间件呈现为一个异步函数&#xff0c;该函数支持 async/await 语法&#xff0c;它接收两个参数&#xff1a;…

【第 1 章 初识 C 语言】1.8 使用 C 语言的 7 个步骤

目录 1.8 使用 C 语言的 7 个步骤 1.8.1 第 1 步&#xff1a;定义程序的目标 1.8.2 第 2 步&#xff1a;设计程序 1.8.3 第 3 步&#xff1a;编写代码 1.8.4 第 4 步&#xff1a;编译 1.8.5 第 5 步&#xff1a;运行程序 1.8.6 第 6 步&#xff1a;测试和调试程序 1.8.…

React 路由与组件通信:如何实现路由参数、查询参数、state和上下文的使用

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

SpringMVC:参数传递之日期类型参数传递

环境准备和参数传递请见&#xff1a;SpringMVC参数传递环境准备 日期类型比较特殊&#xff0c;因为对于日期的格式有N多中输入方式&#xff0c;比如: 2088-08-182088/08/1808/18/2088… 针对这么多日期格式&#xff0c;SpringMVC该如何接收&#xff0c;它能很好的处理日期类…

【MyBatis】验证多级缓存及 Cache Aside 模式的应用

文章目录 前言1. 多级缓存的概念1.1 CPU 多级缓存1.2 MyBatis 多级缓存 2. MyBatis 本地缓存3. MyBatis 全局缓存3.1 MyBatis 全局缓存过期算法3.2 CacheAside 模式 后记MyBatis 提供了缓存切口&#xff0c; 采用 Redis 会引入什么问题&#xff1f;万一遇到需强一致场景&#x…

零基础快速掌握——【c语言基础】数组的操作,冒泡排序,选择排序

1.数组 内存空间连续&#xff1a; 2.定义格式 数组的定义格式&#xff1a; 数组分为一维数组、二维数组、以及多维数组&#xff0c;不同类型的数组定义格式时不一样 2.1 一维数组的定义 数据类型 数组名 [数组长度]&#xff1b; 解释&#xff1a; 数据类型&#xff1…

SpringBoot3.4.0和OpenFeign4.1.4不兼容

SpringBoot3.4.0和OpenFeign4.1.4不兼容 SpringBoot升级到3.4.0版本&#xff0c;和OpenFeign不兼容&#xff0c;maven install 时报错&#xff0c;即使OpenFeign升到最新版本4.1.4&#xff0c;依然不兼容。 SpringBoot版本降为3.3.6 &#xff0c;maven install 成功。 创建日…

PyTorch|彩色图片识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 一、 前期准备 1. 设置GPU 如果设备上支持GPU就使用GPU,否则使用CPU import torch import torch.nn as nn import torchvision.transforms as transforms i…

【Linux】应用层协议—HTTP

一、HTTP协议介绍 请求-响应模型&#xff1a;HTTP (Hyper Text Transfer Protocol) 协议是基于请求和响应的。客户端&#xff08;如Web浏览器&#xff09;发送一个HTTP请求到服务器&#xff0c;服务器处理请求后返回一个HTTP响应。 无状态&#xff0c;无连接协议&#xff1a;H…

消息中间件-Kafka1-实现原理

消息中间件-Kafka 一、kafka简介 1、概念 Kafka是最初由Linkedin公司开发&#xff0c;是一个分布式、支持分区&#xff08;partition&#xff09;、多副本的&#xff08;replica&#xff09;&#xff0c;基于zookeeper协调的分布式消息系统&#xff0c;它的最大的特性就是可以…

【Spring】Spring IOCDI:架构旋律中的“依赖交响”与“控制华章”

前言 &#x1f31f;&#x1f31f;本期讲解关于Spring IOC&DI的详细介绍~~~ &#x1f308;感兴趣的小伙伴看一看小编主页&#xff1a;GGBondlctrl-CSDN博客 &#x1f525; 你的点赞就是小编不断更新的最大动力 &#x1f386;那么…

44 基于32单片机的博物馆安全监控系统设计

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 检测 分别是温湿度 光照 PM2.5、烟雾、红外&#xff0c;然后用OLED屏幕显示&#xff0c; 红外超过阈值则蜂鸣器报警&#xff0c;这是防盗报警&#xff1b;温度或烟雾超过阈值&#xff0c;则蜂鸣器…

VScode离线下载扩展安装

在使用VScode下在扩展插件时&#xff0c;返现VScode搜索不到插件&#xff0c;网上搜了好多方法&#xff0c;都不是常规操作&#xff0c;解决起来十分麻烦&#xff0c;可以利用离线下载安装的方式安装插件&#xff01;亲测有效&#xff01;&#xff01;&#xff01; 1.找到VScod…