汉诺塔问题(C语言)

2023-11-13

汉诺塔问题



汉诺塔是什么?

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

在这里插入图片描述


提示:以下是本篇文章正文内容,下面案例可供参考

一、怎么解决汉诺塔问题

1.1 操作规则

  • 首先得知道汉诺塔怎么移动的,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
  • 汉诺塔是一个经典递归问题,所以我们得先了解函数递归

1.2 函数递归

递归的两个必要条件
  • 存在限制条件,当满足这个限制条件的时候,递归便不再继续
  • 每次递归调用之后越来越接近这个限制条件
   public void recursion(参数0) {
    if (终止条件) {
        return;
    }
    recursion(参数1);
}
例题(斐波那契数列)

总所周知斐波那契数列是从第三个起的数等于前面两数之和。

Fib(n)=Fib(n - 1) + Fib(n - 2);

int Fib(int n)
{
	if(n==0)return 0;
	if (n <= 2)
	return 1;
	else 
	return Fib(n - 1) + Fib(n - 2);
}

//法二
//由于第一个代码在进行比较大的数据,会有大量重复计算,所以减少了计算

int fib(int n) {
	int a = 1, b = 1, c = 1;
	while (n > 2) {
		c = a + b;
		a = b;		
		b = c;
		n--
			}
	return c;
}

二、解题步骤

2.1 代码如下(示例):

#define _CRT_SECURE_NO_WARNINGS 1
#include<bits/stdc++.h>

void hanoi(int n, char a, char b, char c) {
	if (n == 1) {
		printf("%c-->%c\n", a, c);//把最底层的盘子移到c
	}
	else {
		hanoi(n - 1, a, c, b);//将n-1个盘子进过c柱移到b柱
		printf("%c-->%c\n", a, c);//把最底层的盘子移到c
		hanoi(n - 1, b, a, c); //将n - 1个盘子进过b柱移到c柱
	}
}

int main() {
	int m;
	scanf("%d", &m);  
	hanoi(m, 'A', 'B', 'C');
	return 0;
}

2.2 图解

首先来看看那运行结果

在这里插入图片描述
当有3个盘子的时候总共运行了7次
当有4个盘子的时候总共运行了15次
当有4个盘子的时候总共运行了21次

不难发现

2^n-1

也就说汉诺塔是有规律的,有规律就有机会使用递归。
在回顾汉诺塔的操作方式,总是先把n-1经过c柱到b柱(a->c->b),然后让最后一个移动到c柱(a->c),再把b柱的n-1盘子经过a柱到c柱(b->a->c)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2.3 调试

当第一次进行调试进入函数,会进入hanoi(2, a, c, b),然后进入函数hanoi(1, a, c, b),再进入n=1时就会打印第一步先把a柱最上面一个直接移到c柱,结束后再回到n=2的函数继续执行移动把第二个先移到c柱。
在这里插入图片描述
hanoi(1, b, a, c)移动后再往下走就是移动第二个盘子,再把它移动b柱
在这里插入图片描述

回到hanoi(3, a, c, b),往下走打印第三个将它从a移到b

在这里插入图片描述
之后进入hanoi(2, b, a, c)的递归,在进入hanoi(1, a, c, b)打印第一个移到a柱
在这里插入图片描述
调用函数完,回到hanoi(2, b, a, c)在把第二个移动到c柱,hanoi(1, b, a, c)会将第一个从a移动c
在这里插入图片描述

总结

以上就是今天要讲的内容,本文仅仅简单介绍了汉诺塔的解题过程,本人小白来的,如果有错误可以指出来哦。在这里插入图片描述

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

汉诺塔问题(C语言) 的相关文章

随机推荐

  • Go函数--匿名函数与闭包

    0 匿名函数概念 Go语言提供两种函数 有名函数和匿名函数 所谓匿名函数就是没有函数名的函数 匿名函数没有函数名 只有函数体 它和有名函数的最大区别是 我们可以在函数内部定义匿名函数 形成类似嵌套的效果 匿名函数常用于实现回调函数 闭包等
  • is服务器虚拟目录,Tomcat虚拟目录配置

    1 编辑server文件 x tomcat conf server xml 2 只要在server xml文件中加入如下代码即可 注意 在server xml中 此语句 unpackWARs true autoDeploy true xml
  • 数据库:sql 递归

    mysql 自关联表 以下为向下递归以及向上递归样例 1 递归查询前期准备 如果你的表已经存在 可忽略此步 建表 CREATE TABLE wq areainfo id int 11 NOT null AUTO INCREMENT leve
  • 服务器A拷贝文件到服务器B

    命令格式如下 scp 要拷贝的文件名 服务器B的用户名 IP 服务器B要存放的路径 拷贝文件 如 scp install log root 192 168 33 111 home 或 scp install log 192 168 33 1
  • Docker是什么?

    一 概述 Docker是一个用于开发 交付和运行应用程序的开放平台 Docker使您能够将应用程序与基础架构分离 从而实现快速交付软件 借助Docker 您可以以与管理应用程序相同的方式来管理基础架构 通过利用Docker快速交付 测试和部
  • python生成微信个性签名的词云图

    需要用到的库 itchat jieba numpy wordcloud import itchat import re import jieba import matplotlib pyplot as plt import PIL Imag
  • 企业运维

    欢迎关注 全栈工程师修炼指南 公众号 设为 星标 每天带你 基础入门 到 进阶实践 再到 放弃学习 专注 企业运维实践 网络安全 系统运维 应用开发 物联网实战 全栈文章 等知识分享 花开堪折直须折 莫待无花空折枝 作者主页 https w
  • QT控件之(QLabel)中加载了图片想清除掉

    这个时候直接在你加载图片的那个label中使用如下代码 清除label中加载过来的图片 label clear qt学习推荐 百度云盘 链接 https pan baidu com s 11b634VvKMIsGdahyBLpZ3Q 提取码
  • 远程调试Android/IOS设备/微信网页方法汇总

    以下汇总现在可远程调试手机网页的几个方法 基本上官方都有详细的说明文档 可移步至相关网站查看 这里就不赘述使用 操作方法了 微信web开发者工具 PC客户端 官方说明文档 支持Windows和Mac系统 支持调试Android和IOS设备
  • 原生 fetch 请求 fetch和ajax的区别

    比如请求一个json文件 async function 请求 let res fetch data1 json 解析内容 let data await res json 获取到json 文件 console log data 比如请求一个图
  • NG4+NG-ZORRO搭建项目

    一 安装Nodejs Angular CLI 安装nodejs node官网下载安装即可 安装完成后查看版本信息 npm v npm install g angular cli 下载Angular CLI 查看Angular CLI的安装结
  • 【正点原子STM32连载】第四十二章 FLASH模拟EEPROM实验 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1

    1 实验平台 正点原子MiniPro H750开发板 2 平台购买地址 https detail tmall com item htm id 677017430560 3 全套实验源码 手册 视频下载地址 http www openedv
  • 使用Encoder-Decoder模型自动生成对联的思路

    版权声明 可以任意转载 转载时请标明文章原始出处和作者信息 author 张俊林 在我看到第一篇Encoder Decoder模型的论文的时候 我就觉得用这个来作对联自动生成是再合适不过的了 做诗词应该也是比较适合的 但是相对诗词 用它来做
  • Linux wget下载指定目录及重命名

    Linux系统wget下载指定目录及重命名 假设目录为 happy page 假设下载网址为 http www baidu com 假设下载文件的原始文件名为 baidu html 1 指定下载目录 wget P happy page ht
  • PCL-获取点云体素中的所有点的索引的方法

    使用 octree 将点云体素化之后 获取体素中所有点的方法 即OctreeContainerBase中的三个方法的介绍 getPointIndex getPointIndicesVector getPointIndices 这三个方法都是
  • R语言tidyr包的详解

    tidyr用于数据处理 可以实现数据长格式和宽格式之间的相互转换 这里所指的长格式数据就是一个观测对象由多行组成 而宽数据格式则是一个观测仅由一行组成 除此之外 tidyr还可以对数据进行拆分和合并 同时也能够对缺失值进行简单的处理 tid
  • oracle(内置函数)

    1 转换函数 to char to number to date 例子 to number 转成数值型 select to number 22 23 from dual 2 to char 转成字符型 select to char 22 哈
  • Criss-Cross Attention for Semantic Segmentation论文及代码分析

    先附上论文及代码 该工作于2019年发表于ICCV会议 1 Introduction 由于固定的几何结构 传统的FCN受限于局部的感受野 只能提供短程的上下文信息 这对于提升分割任务的精度起到相反的影响 为了弥补FCN的缺陷 ASPP和PP
  • JAVA环境变量的配置及常用工具说明

    首先 到官网www eclipse com下载并安装最新版本的JDK 其次 找到设置位置 我的电脑 右键 属性 高级系统设置 高级 默认 环境变量 系统变量 新建系统变量JAVA HOME和CLASSPATH 变量名 JAVA HOME 变
  • 汉诺塔问题(C语言)

    汉诺塔问题 文章目录 汉诺塔问题 汉诺塔是什么 一 怎么解决汉诺塔问题 1 1 操作规则 1 2 函数递归 递归的两个必要条件 例题 斐波那契数列 二 解题步骤 2 1 代码如下 示例 2 2 图解 2 n 1 在这里插入图片描述 2 3