【C语言】汉诺塔问题

目录

一、何为汉诺塔问题?

二、汉诺塔计算规律

三、打印汉诺塔的移动路径

总结


一、何为汉诺塔问题?

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

简单来讲,汉诺塔问题是这样的:

给定三根柱子,记为A,B,C,其中 A 柱子上有 n个盘子,从上到下编号为 0 到 n−1 ,且上面的盘子一定比下面的盘子小。问:将A 柱上的盘子经由 B柱移动到 C 柱最少需要多少次?并且移动时还有要求:1、一次只能移动一个盘子 2、大的盘子不能压在小盘子上


二、汉诺塔计算规律

我们分别计算有1个圆盘、2个圆盘、3个圆盘、4个圆盘的情况:

.......

3个圆盘需要移动7次,4个圆盘需要移动15次,我们可以得出规律,得到一条计算公式:

2^n - 1 == 移动次数。


三、打印汉诺塔的移动路径

递归打印移动路径,核心思想是大事化小,借助B柱子,一次性移动(n-1)个圆盘到B柱子上,再将A柱子上的圆盘移动到C柱子上,看代码:

//递归方法
//n -- 盘子个数
//post1 -- 起始柱子
//post2 -- 辅助柱子
//post3 -- 目标柱子
void move(char post1,char post2)
{printf("%c->%c ", post1, post2);
}
void hanoi(int n,char post1,char post2,char post3) 
{//当n==1时,只有一个盘子//post1 -> post3 即可//递归的终止条件if (n == 1){move(post1, post3);}else{//将n-1个盘子从post1通过post3移动到post2。hanoi(n-1, post1, post3, post2);// move(post1, post3); //函数的作用是模拟将一个盘子从 post1 柱子移动到 post3 柱子,//并打印出这一移动的过程。move(post1, post3);//将n-1个盘子从post2通过post1移动到post3。hanoi(n-1, post2, post1, post3);}
}
int main() 
{hanoi(2, 'A', 'B', 'C');return 0;
}

代码解释:

当盘子数量为1时:我们只需要将它从起始柱子直接移动到目标柱子。这也是递归的终止条件。

当盘子数量大于1时,我们执行以下三个步骤:

  •  将n-1个盘子从post1通过post3移动到post2
  •  将剩下的那个盘子(最大的那个)从post1移动到post3
  •  将n-1个盘子从post2通过post1移动到post3

总结

关于汉诺塔问题,还有很多的知识点,比如如何求总共的计算次数,以及使用汉诺塔思想求解问题等等,后面均会一一的进行补充,感谢支持!!

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

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

相关文章

nssm 工具把asp.net core mvc变成 windows服务,使用nginx反向代理访问

nssm工具的作用&#xff1a;把项目部署成Windows服务&#xff0c;可以在系统后台运行 1.创建一个asp.net core mvc的项目weblication1 asp.net core mvc项目要成为windows服务需要安装下面的nuget包 <ItemGroup><PackageReference Include"Microsoft.Extension…

windows上使用influx2.7学习

参考 官方文档&#xff1a;https://docs.influxdata.com/influxdb/v2/ 下载 需要下载两样东西&#xff1a;influxd.exe和influx.exe influxd:influx数据库的服务端。下载地址&#xff1a;https://dl.influxdata.com/influxdb/releases/influxdb2-2.7.5-windows.zipinflux:连…

基于JAVA+SSM+微信小程序+MySql+前后端分离的图书捐赠管理系统设计与实现

一、项目背景介绍&#xff1a; 在当今社会&#xff0c;图书捐赠是一种普遍而有益的行为&#xff0c;旨在促进阅读、教育和知识传播。图书捐赠可以帮助改善教育资源不足的地区、学校和社区的阅读环境&#xff0c;提供更多的学习机会和知识获取途径。随着互联网和移动技术的发展&…

【数据分享】1981-2023年全国各城市逐日、逐月、逐年最低气温(Excel格式)

气象数据是我们在各种研究中都会使用到的基础数据。气象数据是我们在各种研究中都会使用到的基础数据&#xff0c;之前我们分享了Excel格式1981-2023年全国各城市逐日、逐月、逐年平均气温数据、降水量数据和最高气温数据&#xff08;可查看之前的文章获悉详情&#xff09;&…

【系统架构师】-软件架构设计

1、软件架构的概念 架构的本质 1、软件架构为软件系统提供了一个结构、行为和属性的高级抽象。 2、软件架构风格是特定应用领域的惯用模式&#xff0c;架构定义一个词汇表和一组约束。 架构的作用 1、软件架构是项目干系人进行交流的手段。 2、软件架构是可传递和可复用的模型…

Spring定义Bean对象笔记(二)

前言&#xff1a;上一篇记录了通过XML文件来定义Bean对象&#xff0c;这一篇将记录通过注解和配置类的方式来定义Bean对象。 核心注解&#xff1a; 定义对象&#xff1a;Component,Service,Repository,Controller 依赖注入&#xff1a; 按类型&#xff1a;Autowired 按名称&am…

商城系统如何设计表

小商城&#xff1a;参考千小夜小程序 大商城&#xff1a; 首先根据某个商品的三级分类进来后&#xff0c;我们找到在这个分类下该商品的所有属性&#xff08;也就是泛指该商品不管怎么样都有这些属性&#xff09;&#xff0c;这里指的属性是规格包装&#xff0c;也就是基本属性…

12、最小覆盖子串

如何想到这个解法 问题的特点&#xff1a; 首先&#xff0c;认识到这是一个关于子串的问题&#xff0c;而且需要考虑子串的最小长度。这提示我们可能需要使用一种方式来逐步探索不同的子串。滑动窗口的适用性&#xff1a;滑动窗口是处理子串问题的常用技巧&#xff0c;特别是当…

串口和 蓝牙模块HC08

串口基本认知 串行接口简称串口&#xff0c;也称 串行通信 接口或 串行通讯接口 &#xff08;通常指 COM 接口 &#xff09;&#xff0c;是采用串行通信方 式的 扩展接口 。串行 接口&#xff08;Serial Interface &#xff09;是指数据一位一位地顺序传送。其特点是 通信线路…

Spring Security——11,自定义权限校验方法

自定义权限校验方法 一键三连有没有捏~~ 我们也可以定义自己的权限校验方法&#xff0c;在PreAuthorize注解中使用我们的方法。 自定义一个权限检验方法&#xff1a; 在SPEL表达式中使用 ex相当于获取容器中bean的名字未ex的对象。然后再调用这个对象的 hasAuthority方法&am…

ssm026校园美食交流系统+vue

校园美食交流系统 摘 要 1 前 言 3 第1章 概述 4 1.1 研究背景 4 1.2 研究目的 4 1.3 研究内容 4 第二章 开发技术介绍 5 2.1Java技术 6 2.2 Mysql数据库 6 2.3 B/S结构 7 2.4 SSM框架 8 第三章 系统分析 9 3.1 可行性分析 9 3.1.1 技术可行性 9 3.1.2 经济可行…

jdk目录结构

jdk目录详解 JDK(Java Development Kit&#xff0c;Java开发包&#xff0c;Java开发工具)是一个写Java的applet和应用程序的程序开发环境。它由一个处于操作系统层之上的运行环境还有开发者 编译&#xff0c;调试和运行用Java语言写的applet和应用程序所需的工具组成。 JDK(J…