C语言解决汉诺塔问题

         背景

        首先带大家了解一下汉诺塔问题

        汉诺塔是一个典型的函数递归问题,汉诺塔描述了这样的场景,有三个柱子,A,B,C,A柱为起始柱,在A柱上面有若干大小不同的盘子,最下面的最大,最上面的最小,从下往上依次递减,我们将通过一些方式将这些盘子移动到C柱上,在移动的过程中,我们可以借助B柱,也就是辅助我们完成A->C柱的移动。在移动盘子的时候有些规则需要我们遵守。

        1.每次只能移动一个盘子。

        2.大盘子永远不能放在小盘子上面。

        

       递归的概念

        什么是递归?

        程序调用自身的编程技巧称为递归,递归作为一种算法在程序设计中广泛应用。一个过程或者函数在其他定义或说明中有直接或间接调用自身的一种方法被称之为递归。

        递归通常把一个大的复杂的问题层层转化成一个与原问题相似的规模较小的问题来求解。

        递归算法只需要少量的程序就可以描述出解题过程所需要的多次重复计算,大大减少了程序的代码量。

        但是想要使用递归有两个必要的条件

        1.递归必须存在限制条件,当满足这个限制条件的时候,递归不再继续。

        2.每次的递归调用之后会越来越接近这个限制条件。

        在我们今天的汉诺塔问题中,限制条件就是n=1

        汉诺塔问题图解

        我们来简单模拟一下三个盘子的移动,体会一下汉诺塔问题。

        好啦,我们在汉诺塔的n等于3的时候,是这样移动盘子的,我们通过中间的中转盘b来解决我们汉诺塔问题。具体步骤如下。

        我们首先以C柱为中转柱,将最上面的两个盘子移动到B柱上,之后我们将B柱作为起始柱,将一个大的汉诺塔问题化为一个小的汉诺塔问题,以A柱为中转柱重复操作。在这个过程中,n是逐渐变小的,所以我们这里可以理解为逐级的n-1。

        我们通过7步可以解决。

A->C
A->B
C->B
A->C
B->A
B->C
A->C

        代码实现

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
//定义一个函数
void hanio(int n, char A, char B, char C)
{//设置限制条件if (n == 1){printf("%c->%c\n", A, C);}else{
//将n-1个盘子从源柱移动到辅助柱hanio(n - 1, A, C, B);printf("%c->%c\n", A, C);
//将n-1个柱子从辅助柱移动到目标柱hanio(n - 1, B, A, C);}
}
int main()
{int n;printf("请输入汉诺塔层数:>");scanf("%d", &n);hanio(n, 'A', 'B', 'C');
}

        运行结果

        以3个盘子为例

        

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

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

相关文章

状态机与重传机制

CP协议比较复杂&#xff0c;接下来分两篇文章浅要介绍TCP中的一些要点。 本文介绍TCP的状态机与重传机制&#xff0c;下文讲解流量控制与拥塞控制。 前置知识 一些网络基础 TCP在网络OSI的七层模型中的第四层——Transport层&#xff0c;IP在第三层——Network层&#xff0c…

高个子男生穿什么裤子好看?高个子男装店铺推荐

大家每隔一段时间都需要购置新的衣服&#xff0c;但是由于目前市面上的服装品牌非常多&#xff0c;而且质量也参差不齐&#xff0c;不少新闻都经常报道许多衣服材质面料不合格&#xff0c;出去闷热不透气、不耐洗等问题。 所以今天就从面料、风格等方面进行测评&#xff0c;并…

FreeRTOS临界段代码保护和任务调度器的挂起与恢复学习

FreeRTOS临界段代码保护和任务调度器的挂起与恢复学习 临界段代码保护 所谓临界段代码保护就是指必须完成运行&#xff0c;不能被打断的代码段。比如需要严格按照时序除初始化的外设&#xff1a;IIC、SPI&#xff0c;再或者因为系统自身需求和用户需求。 FreeRTOS 在进入临界…

SMW200A罗德与施瓦茨SMW200A信号发生器

181/2461/8938产品概述&#xff1a; SMW200A是开发新型宽带通信系统&#xff0c;验证3G和4G基站&#xff0c;以及需数字调制信号的理想信号发生器。 SMW200A 矢量信号发生器 具有内部基带、高达2 GHz的I/Q调制带宽可以满足第4代和第5代标准(例如&#xff0c;5G、LTE-Advanced…

比例多路阀控制器US-DAT2-A

液压比例阀放大器是一种用于精确控制液压系统的技术&#xff0c;它通过电信号实现对液压阀的连续量控制。接收来自控制器的低功率电信号&#xff0c;然后将其放大并转换为高功率信号&#xff0c;这个高功率信号足以驱动比例阀的开启和关闭。这种技术允许进行非常精细的调节&…

想要实现自动化批量抓取淘宝商品数据店铺数据订单数据的看过来(淘宝开放平台API调用实例)

item_get 获得淘宝商品详情 获取API测试keyitem_get_pro 获得淘宝商品详情高级版item_review 获得淘宝商品评论item_fee 获得淘宝商品快递费用item_password 获得淘口令真实urlitem_list_updown 批量获得淘宝商品上下架时间seller_info 获得淘宝店铺详情item_search 按关键字…

过亿级别的用户数据如何检查用户名是否存在?

目录 引言用户名存在性检查的挑战用户规模庞大带来的性能挑战数据一致性与并发性问题防止恶意行为的挑战 常见的解决方案基于数据库的方案基于缓存的方案基于分布式系统的方案基于搜索引擎的方案 案例分析与实践经验分享社交媒体平台的用户名检查方案 引言 随着互联网的普及和数…

AI预测福彩3D第29弹【2024年4月7日预测--第7套算法重新开始计算第2次测试】

今天咱们继续进行进行第7套算法的测试&#xff0c;今天是第2次测试&#xff0c;昨天已经成功命中&#xff0c;其中7码大方案全部命中&#xff0c;四码小方案也命中。再接再厉&#xff0c;继续验证&#xff0c;废话不多说&#xff0c;直接上图上结果~ 2024年4月7日3D的七码预测结…

Python项目21:一个简单的记账系统(收入+支出+查询)

------------★Python练手项目源码★------------ Python项目源码20&#xff1a;银行管理系统&#xff08;开户、查询、取款、存款、转账、锁定、解锁、退出&#xff09; Python项目19&#xff1a;学员信息管理系统&#xff08;简易版&#xff09; Python项目18&#xff1a;…

Nacos集群监控搭建

Nacos集群监控搭建 结合prometheus和grafana监控Nacos Nacos 0.8.0版本完善了监控系统&#xff0c;支持通过暴露metrics数据接入第三方监控系统监控Nacos运行状态。 搭建Nacos集群暴露metrics数据 按照之前的集群搭建文档&#xff0c;搭建一个nacos集群。配置application.p…

分享多张自己绘制的 JavaScript 原型图

svg 图片自取 先来个最经典的 然后是对象与 Object 接着是函数与 Function。图中的 [[Prototype]] 指的就是原型对象 Function 和 Object 之间的关系也不能少。 这两个对象 Object 和 Function 是由 v8 自己创建的&#xff0c;理由是打印这两个对象时&#xff0c;终端输出 ƒ…

Django複習總結

①Django是框架。那麼什麼是框架&#xff1a; 框架很像是一個骨架&#xff0c;帶有很多默認器官的骨架。我們可以根據需要改寫、複寫這些器官。 從而實現自己所需要的功能。 ②Django是MVC模型\MVT模型&#xff1a; MVC模型&#xff1a;M&#xff1a;models模型層 V&#…