【经典问题:汉诺塔】C语言编写程序实现汉诺塔问题——函数递归

2023-05-16

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

分析问题:假设有n层塔(对其进行编号为1,2,3....n),并且对三根柱子进行编号为a,b,c。如果要把其全部从a移动到c,那么如果把上面的n-1层作为整体来看,我们只需把上面的n-1层移动到b,然后第n层移动到c,再把n-1层移动到c即可。

 如果想把n-1层从a移动到b(a->b)需要先把n-2层从a移动到c(a->c),再把第n-1层从a移动到b,最后把n-2层从c移b(c->b)。 

 如果想把n-2层从c移动到b(c->b)需要先把n-3层从c移到a(c->a),再把第n-2层从c移动到b,最后把n-3层从a移b(a->b)。

后面再分析就会进入循环;

如果想把n-1层从b移动到c(b->c)需要先把n-2层从b移动到a(b->a),再把第n-1层从b移动到c,最后把n-2层从a移c(a->c)。

如果想把n-2层从a移动到c(a->c)需要先把n-3层从a移动到b(a->b),再把第n-2层从a移动到c,最后把n-3层从b移到c(b->c)。

后面分析同上,也会进入循环;

因此总共有6个不同的步骤,(a->b;a->c;c->b;c->a;b->c;b->a)这六个不同的步骤进行组合迭代得到结果。

下面进行C语言代码实现。

输入为汉诺塔的层数。输入为每一层要移动到哪个柱子。

#include<stdio.h>//汉诺塔的步骤
void tower1(int x, char c1, char c2, char c3);
void tower2(int x, char c1, char c2, char c3);
void tower3(int x, char c1, char c2, char c3);
void tower4(int x, char c1, char c2, char c3);
void tower5(int x, char c1, char c2, char c3);
void tower6(int x, char c1, char c2, char c3);
void tower1(int x, char c1, char c2, char c3)//c1->c2
{
	if (x >= 1)
	{
		tower3(x - 1, c1, c2, c3);
		printf("%d->%c\n", x, c2);
		tower4(x - 1, c1, c2, c3);
	}
}
void tower2(int x, char c1, char c2, char c3)//c2->c3
{
	if (x >= 1)
	{
		tower5(x - 1, c1, c2, c3);
		printf("%d->%c\n", x, c3);
		tower3(x - 1, c1, c2, c3);
	}
}
void tower3(int x, char c1, char c2, char c3)//c1->c3
{
	if (x >= 1)
	{
		tower1(x - 1, c1, c2, c3);
		printf("%d->%c\n", x, c3);
		tower2(x - 1, c1, c2, c3);
	}
}
void tower4(int x, char c1, char c2, char c3)//c3->c2
{
	if (x >= 1)
	{
		tower6(x - 1, c1, c2, c3);
		printf("%d->%c\n", x, c2);
		tower1(x - 1, c1, c2, c3);
	}
}
void tower5(int x, char c1, char c2, char c3)//c2->c1
{
	if (x >= 1)
	{
		tower2(x - 1, c1, c2, c3);
		printf("%d->%c\n", x, c1);
		tower6(x - 1, c1, c2, c3);
	}
}
void tower6(int x, char c1, char c2, char c3)//c3->c1
{
	if (x >= 1)
	{
		tower4(x - 1, c1, c2, c3);
		printf("%d->%c\n", x, c1);
		tower5(x - 1, c1, c2, c3);
	}
}
void tower(int x, char c1, char c2, char c3)//c1->c3
{
	if (x >= 1)
	{
		tower1(x - 1, c1, c2, c3);
		printf("%d->%c\n",x,c3);
		tower2(x - 1, c1, c2, c3);
	}
}
int main()
{
	char part1='a', part2='b', part3='c';
	int n = 0;
	printf("请输入汉诺塔的高度:");
	scanf_s("%d", &n);
	printf("移动汉诺塔的步骤:\n");
	tower(n, part1, part2, part3);
	return 0;
}

运行结果展示:

运行结果正确。

(ps:代码完成以后,在CSDN上有大致看了看其他的代码,发现大家的输入结果都是从一个柱子移动到另外一个柱子,并且代码很短。我这代码实现有点长了。目前我没有想到更简洁的方法。很开心的一点是,这次写的代码,一次通过了,没有调试。如有更简便的方法,恳请指教。这是第一次写C语言的博文,以后回过头来再看这篇博文肯定漏洞百出,hh。) 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【经典问题:汉诺塔】C语言编写程序实现汉诺塔问题——函数递归 的相关文章

  • python安装jupyter lab和使用插件

    如果觉得本篇文章对您的学习起到帮助作用 xff0c 请 点赞 43 关注 43 评论 xff0c 留下您的足迹 x1f4aa x1f4aa x1f4aa 本篇文章为python安装jupyter lab和使用插件的所做笔记 xff0c 一是
  • Bean的初始化和销毁(java配置方式)

    bean生命周期管理 spring对bean的生命周期的操作提供了支持 xff0c java配置和注解配置分别使用如下方式 xff1a 1 java配置 xff1a 使用 64 Bean 的initMethod和destoyMethod 2
  • UWB使用教程

    前言 本篇文章主要对淘宝商家给的UWB资料进行整理 xff0c 方便大家快速入门 注重UWB定位模块的使用 xff0c 不解释具体的原理 实现功能 xff1a 搭建UWB基站使用上位机配置参数ROS接受UWB的定位信息修改IMU的STM32
  • 【Tiva_C系列】一、ARM Cortex-M4F 处理器

    ARM Cortex M4F 处理器 0 引言1 Cortex M4处理器和基于Cortex M4的MCU2 Cortex M4F处理器结构3 存储器映射4 处理器模式和软件执行的权限级别5 内核寄存器6 异常和中断处理6 1 优先级6 2
  • Windows11解决无法设置移动热点

    文章目录 前言1 解决办法 前言 今天装了个Win11 xff0c 回头发现移动热点无法打开 xff0c 在网上找了好久 xff0c 才找到解决方案 xff0c 这里分享下解决方案 1 解决办法 打开设备管理器 找到网络适配器 启用这两个设
  • python实现aruco的生成和检测

    OpenCV aruco的生成 import cv2 as cv import numpy as np if name 61 61 39 main 39 Load the predefined dictionary dictionary 6
  • SMPL经典论文

    摘要 模型参数从这些数据中学习 xff1a 休息姿势模板 混合 xff08 blend xff09 权重 与姿势相关的混合形状 与身份相关的混合形状 从顶点到关节位置的回归器与姿势相关的混合形状是姿态旋转矩阵的线性函数 xff0c 这个简单
  • 灰度图片二值化matlab

    rge图片灰度化之后 xff0c 往往存在灰度值比较近的情况 根据自己的需求将灰度值调到两个极端值 xff0c 也叫做阈值处理 本文的阈值是自定义的 xff0c 建立在已经读取到灰度图片灰度值的基础之上 存在获取灰度图片最佳阈值的算法 大津
  • Maven Helper插件下载&Maven导入jar包(依赖管理)

    1 maven Helper插件 1 1搜索 File gt Settings gt Plugins gt 搜索Maven Helper 发现没有 1 2 安装 点击Browse reositories gt 选择maven Helper
  • Ubuntu18.04下基于ROS和PX4的无人机仿真平台的基础配置搭建

    Ubuntu18 04下基于ROS和PX4的无人机仿真平台的基础配置搭建 参考资料 xff1a https www yuque com xtdrone manual cn basic config 1 11 https blog csdn
  • darknet_ros安装的以及在PX4无人机仿真平台的目标检测

    darknet ros的安装以及在PX4无人机仿真平台的目标检测 参考资料 xff1a https github com leggedrobotics darknet ros https gitee com robin shaun XTDr
  • Ubuntu上设置查看SSH Key并在GitHub上添加设置

    这里讲了如何在Ubuntu设置查看SSH key并在GitHub上添加设置 有的时候git clone可能出现错误 xff1a 这需要我们在Ubuntu设置查看SSH key并在GitHub上添加设置 1 在终端上输入 ssh keygen
  • git 添加更新子模块

    添加submodule到仓库 下载父仓库 git clone git 64 gitlab span class hljs preprocessor abc span span class hljs preprocessor com span
  • Docker容器图像界面显示到宿主机屏幕配置方法——挂载方式

    原理简介 可以把docker镜像看做一台没配显示器的电脑 xff0c 程序可以运行 xff0c 但是没地方显示 而linux目前的主流图像界面服务X11又支持 客户端 服务端 xff08 Client Server xff09 的工作模式只
  • JETSON TX2卸载原有的opencv安装opencv3.2

    参考博客 xff1a http blog csdn net u014613745 article details 78310916 http blog csdn net public669 article details 99044895
  • Ubuntu使用ros进行多电脑IP通信

    TUF Gaming是我的笔记本 xff0c master是实验室的主机 xff0c 在同学komorebi fresh xff08 https me csdn net weixin 44270815 xff09 的帮助下把我自己的笔记本和
  • Mavros与无人机

    记录一些mavros与无人机的指令 xff0c 这篇博客只是起备忘录的作用 飞控接口赋权 span class token function sudo span span class token function chmod span 77
  • Ubuntu18.04安装ax200网卡驱动以及更新内核

    Ubuntu18 04安装ax200网卡驱动以及更新内核 参考资料 xff1a https zhangyiming748 github io 2019 12 05 useAX200OnUbuntu 原来的网卡是小螃蟹的8822ce xff0
  • 笔记:QGC使用及姿态环仿真调节方式

    笔记 xff1a QGC使用及姿态环仿真调节方式 打开Gazebo及QGC 进入终端管理员权限 sudo s 在终端打开Gazebo cd Firmware make px4 sitl default gazebo 点击文件夹中的QGC x
  • PIX4飞控调参

    飞控调参

随机推荐

  • nano板载电脑连接无线时断时续

    在无人机上使用nano b01板载电脑 xff0c 在地面站电脑上ssh板载电脑名字及ip地址可进入地面站电脑 通过在两个电脑的 bashrc文件中加入主从节点ip xff0c 实现ros通信 xff0c 想要实现用地面站电脑控制板载电脑
  • 树莓派小车————避障篇

    避障模块的功能就是让小车能够检测到障碍物并且可以正确的避开障碍物 当然避障的方式有很多种 我选择的是超声波结合红外传感器来避障 为什么要用超声波传感器结合红外传感器 xff1f 因为硬件原因 xff0c 没有舵机 xff0c 原本超声波可以
  • 睿尔曼超轻量仿人机械臂--Realsense D435手眼标定

    目录 1 环境要求 2 概述 3 开始前准备 4 aruco ros配置 5 easy handeye配置 6 启动相关launch文件开始标定 1 环境要求 本教程主要介绍RM机械臂与Realsense D435相机手眼标定的配置及方法
  • Docker容器-------dockerfile概念简介

    文章目录 引言一 dockerfile概念二 Docker镜像的创建1 基于现有镜像创建2 基于本地模板创建3 基于dockerfile创建3 1 dockerfile结构 xff08 四部分 xff09 3 2 构建镜像命令 三 Dock
  • 关联github与dockerhub生成镜像

    首先登录dockerhub xff0c 按照下面的步骤 xff0c 绑定github账户 然后选择Create Create Automated build xff0c 选中指定的dockerfile项目 选中指定的Dockerfile自动
  • VSCode远程连接Gitee

    目录 1 gitee介绍2 准备3 生成ssh公钥4 添加公钥5 初始化git6 关联远程仓库7 推送更新的代码8 拉取远程仓库代码9 移除远程连接 1 gitee介绍 Gitee xff08 码云 xff09 是开源中国 xff08 OS
  • 从零开始搭建ROS下Intel RealSense D435i的使用环境(全安装流程记录)

    文章目录 一 Ubuntu16 04安装二 Ubuntu16 04下的ROS安装三 cmake升级替换四 相机SDK安装 xff08 注意 xff1a 安装时不要连接相机 xff09 五 安装对应的ROS接口六 关闭红外结构光参考文章 为了
  • 解决fp = builtins.open(filename, “w+b“)FileNotFoundError: [Errno 2] No such file or directory:

    最近在做一些关于图像处理方面的问题 xff0c 用到了python中的PIL库对图像进行保存 xff0c 代码如下 span class token comment 新建一张图片 span GroundImg span class toke
  • python-旋转图像并裁剪出黑色边框

    在进行旋转图像时 xff0c 遇到了旋转后的图像存在黑边的情况 xff0c 上网查了很多方法 xff0c 找到了这个方法是比较好的 xff0c 附上链接添加链接描述 span class token keyword def span spa
  • 解决NetworkX遇到 AttributeError: ‘Graph‘ object has no attribute ‘node‘ 问题

    学习NetworkX时 xff0c 查看结点属性时遇到了报错 xff1a AttributeError Graph object has no attribute node G span class token operator 61 sp
  • Docker的安装以及可视化图形界面的安装

    Dockerd的主要作用 xff1a 起到一个 容器 xff08 代码 43 环境 xff09 的作用 xff0c 解决了软件跨环境迁移导致的版本不兼容等问题 使用沙箱机制 xff0c 相互之间没有任何接口 xff0c 且性能开销极低 Do
  • MySQL数据库忘记密码后,如何修改密码

    MySQL修改密码 xff08 本人亲身试验可行 xff01 xff09 1 以管理员身份打开命令行 2 在命令行中进入MySQL的bin目录所在文件夹 即 xff1a 在命令行中输入 xff1a cd 路径 路径查找如下 xff1a 命令
  • 人工智能_03

    逻辑回归 xff08 用于解决分类问题的一种模型 xff0c 核心 xff1a 找到决策边界 xff09 根据数据的特征或者属性 xff0c 计算出其归属于某一类别的概率 P x P x P x
  • 人工智能_04

    无监督学习 xff08 Unsupervised Learning xff09 机器学习的一种方法 xff0c 没有给定事先标记过的训练示例 xff0c 自动对输入的数据进行分类或分群 优点 xff1a 算法不受监督信息 xff08 偏见
  • 远程连接本地以及其他机器上的Ubuntu虚拟机

    连接本机的Ubuntu虚拟机 xff1a 1 查看Ubuntu虚拟机是否安装了ssh服务 xff1a service sshd status 2 安装ssh服务 sudo apt get install openssh server 3 开
  • 注册中心Nacos

    注册中心 nacosNacos注册中心与配置中心nocos优点与缺点启动docker镜像测试linux windows下单机启动应用启动个报错nacos如何修改用户名密码 nacos Nacos注册中心与配置中心 nacos官方文档 Nac
  • git常见问题

    git常见错误 1 在git pull时遇到fatal refusing to merge unrelated histories错误 意思是 xff1a 拒绝合并不相关的分支 表示要合并的本地分支和远程分支是相互独立而不是相关联的 我的情
  • PID 控制器

    本文参考 xff1a 从不懂到会用 xff01 PID从理论到实践 哔哩哔哩 bilibili 目录 1 PID控制器入门 1 1 PID控制器的引入 1 2 PID控制器适用系统 1 3 PID控制器宏观意义 2 PID控制器的必备知识
  • Linux - 第11节 - 网络入门

    目录 1 计算机网络背景 1 1 网络发展 1 2 认识 34 协议 34 2 网络协议初识 2 1 协议分层 2 2 OSI七层模型 2 3 TCP IP五层 xff08 或四层 xff09 模型 3 网络传输基本流程 3 1 同局域网的
  • 【经典问题:汉诺塔】C语言编写程序实现汉诺塔问题——函数递归

    汉诺塔 xff08 Tower of Hanoi xff09 xff0c 又称河内塔 xff0c 是一个源于印度古老传说的益智玩具 大梵天创造世界的时候做了三根金刚石柱子 xff0c 在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘 大梵