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个盘子为例

        

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【教程】VOC数据集制作

语义分割任务中VOC数据集的制作&#xff0c;任务中只有一种标签&#xff1a;gas 文章目录 1、由黑白图像识别为txt标签2、txt转json3、数据集转VOC格式 1、由黑白图像识别为txt标签 由于使用CycleGAN网络进行风格迁移学习&#xff0c;生成了大量伪标签图像&#xff0c;因此需…

Python基于深度学习的屋内烟雾检测系统的研究与实现,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

实现Hello Qt 程序

&#x1f40c;博主主页&#xff1a;&#x1f40c;​倔强的大蜗牛&#x1f40c;​ &#x1f4da;专栏分类&#xff1a;QT❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 一、使用 "按钮" 实现 1、纯代码方式实现 2、可视化操作实现 &#xff08;1&#xff09…

计算机网络基础(二)

之前我们讲到了计算机网络的分类&#xff0c;现在我们继续讲解&#xff1a; 一.按网络的线路结构进行分类 1.星型 如上图&#xff0c;星型型拓扑结构是目前局域网普遍采用的一种拓扑结构。 特点&#xff1a; 星型拓扑结构是用一个节点作为中心节点&#xff0c;其他节点直接与…

常见的线程安全类

线程安全&#xff01;线程安全&#xff01;&#xff01;线程安全&#xff01;&#xff01;&#xff01; 鼠鼠我最近被线程安全这个词弄得好烦啊&#xff0c;那既然如此就来写一篇常见的线程安全类防止以后鼠鼠我的大脑又宕机了忘记了....... 这里我们讨论的线程安全的是指&am…

【C#】版本号

&#x1f4bb; 代码 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace ConsoleApp16 {internal class Program{static void Main(string[] args){Version version01 new Version("4.0.0…

软件设计师-基础知识科目-计算机基础知识1

前言&#xff1a; 我去年11月份参加了软件设计师的考试&#xff0c;一次性顺利通过了该考试。去年11月份的考试首次改革成机考。考试时间上从一整天压缩成一个下午。考试难度无法评价&#xff0c;因为是第一次参加该考试。我考前利用4个月时间准备&#xff0c;准备时间看似很长…

Word wrap在计算机代表的含义(自动换行)

“Word wrap”是一个计算机术语&#xff0c;用于描述文本处理器在内容超过容器边界时自动将超出部分转移到下一行的功能。在多种编程语言和文本编辑工具中&#xff0c;都有实现这一功能的函数或选项。 在编程中&#xff0c;例如某些编程语言中的wordwrap函数&#xff0c;能够按…

检查网站连接是否安全

要确认某个网站是否可以安全地进行访问&#xff0c;您可以查看有关该网站的安全信息。如果您无法安全地或以私密方式访问网站&#xff0c;浏览器将会发出提醒。 1. 在 浏览器 中&#xff0c;打开相应网页。 2.要确认网站的安全性&#xff0c;请查看网址左侧显示的安全状态图标…

学习:面向云备份提供商的 Solidigm 固态硬盘

SSD与HDD的区别 SSD和HDD之间的主要区别在于它们如何存储和传输数据。HDD有一个旋转盘片或磁盘&#xff0c;用于读取和写入数据。HDD的每GB初始价格通常低于SSD&#xff0c;这使其成为大型机构&#xff08;如金融机构、政府数据存储设施、高性能计算中心&#xff08;HPC&#…

ERC314协议代币开发及合约开发详解

ERC314 是一种新的代币标准&#xff0c;旨在为 BASE 链上的代币提供更便捷、高效的交易体验。它由 DAPJ 项目团队开发&#xff0c;并于 2023 年 8 月首次发布。 ERC314 的特点 无需依赖 DEX 或 SWAP 进行交易: ERC314 代币可以像原生代币一样直接转账&#xff0c;无需借助 DEX …

[mmu/cache]-MMU的地址翻译(Address translation)指令介绍

快速链接: 【精选】ARMv8/ARMv9架构入门到精通-[目录] &#x1f448;&#x1f448;&#x1f448; Address translation system instructions AT指令的语法格式&#xff1a; 有了上面的语法格式后&#xff0c;就非常好理解armv8的MMU提供了14条AT指令了&#xff1a; MMU的地址…

【编译原理】手工打造语法分析器

重点&#xff1a; 语法分析的原理递归下降算法&#xff08;Recursive Descent Parsing&#xff09;上下文无关文法&#xff08;Context-free Grammar&#xff0c;CFG&#xff09; 关键点&#xff1a; 左递归问题深度遍历求值 - 后续遍历 上一篇「词法分析器」将字符串拆分为…

elementPlus el-table动态列扩展及二维表格

1、循环列数据源&#xff0c;动态生成列 <template><div><el-table ref"table" :data"pageData.tableData" stripe style"width: 100%"><el-table-column v-for"column in pageData.columns" :key"column.p…

linux虚拟机上安装,使用以及远程连接mysql

1. 安装mysql 5.7 1) 首先更新软件源 sudo apt-get update 2) 安装MySQL数据库软件 ​ sudo apt-get install mysql-server 3) 安装MySQL数据库管理软件​ sudo apt-get install mysql-client 4) 安装MySQL数据库客户端&#xff0c;用户访问数据库 sudo apt-get install…

大数据系列 | Kafka架构分析及应用

大数据系列 | Kafka架构分析及应用 1. Kafka原理分析2. Kafka架构分析3. Kafka的应用3.1. 安装Zookeeper集群3.2. 安装Kafka集群3.3. 生产者和消费者使用3.3.1. 生产者使用3.3.1. 消费者使用 4. Kafka Controller控制器 1. Kafka原理分析 Kafka是一个高吞吐量、 持久性的分布式…

【RealSense】Ubuntu20.04 安装 Intel RealSense ROS 并使用 D435i 测试

【RealSense】Ubuntu20.04 安装 Intel RealSense ROS 并使用 D435i 测试 1 本机环境2 安装流程3 存在的 bug3.1 Resource not found: rgbd_launch 1 本机环境 Ubuntu20.04ROS Noetic 2 安装流程 参考文档: Link 安装 Intel RealSense™ SDK 2.0&#xff0c;参考上一篇文章: L…

HTML基础知识详解(下)(如果想知道html的全部基础知识点,那么只看这一篇就足够了!)

前言&#xff1a;在上一篇文章中&#xff0c;我们已经学习完了超链接标签、列表标签和表格标签&#xff0c;但是我们还有一些标签没有学习&#xff0c;在这篇文章中&#xff0c;我们将学习剩余的标签。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我的主页…

vue3+element-ui-plus的el-tree组件实现复选框形式下的单选功能,且禁用父级

实现效果图&#xff0c;一二级都是灰色的不可选&#xff0c;三级只能同时选中一个 <el-treev-model"selectedNode":data"deptOptions":props"{ label: title, children: children }" //自定义名称和子集的字段:render-after-expand"fal…

天府锋巢直播产业基地:打造电商直播产业先锋集群

天府锋巢直播产业基地&#xff0c;这座以科技金融服务、人才项目扶持、科技企业培育和产业生态链赋能为核心的成都直播产业园区&#xff0c;正积极招商引资&#xff0c;争做电商直播产业的先锋集群。 一、科技金融服务方面&#xff0c;天府锋巢直播产业基地针对科技型小微企业、…