C语言 递归实现汉诺塔问题 【图文讲解、简单易懂】

2023-11-07

 汉诺塔问题是我们在学习函数递归时常遇见的一类问题,那么如何用简单易懂的思路来解决汉诺塔问题呢?下面我会为大家进行讲解

目录

汉诺塔是什么?

 汉诺塔的来源

         用C语言实现汉诺塔

汉诺塔问题分析思路:

用代码实现汉诺塔问题

总结


汉诺塔是什么?

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

 汉诺塔的来源

法国数学家爱德华·卢卡斯曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面。僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔、庙宇和众生也都将同归于尽。

 用C语言实现汉诺塔

汉诺塔问题分析思路:

首先,我们先来看一下汉诺塔问题的题目:

 现有三个柱子A、B、C,其中有N个圆盘安从小到大的顺序在A柱上,要求将圆盘按从小到大的顺序借助B柱移动到C柱中。

 对于N个处于A柱上的圆盘,我们可以用的从特殊到一般思想将题目简单化,如先思考当N=1的情况,便于我们对题目进行更深一步的分析

当 N = 1 时:

 由图可知,当 N = 1 时,我们只须将A中圆盘直接移动到C盘上即可即(A-->C)

那么当 N = 2 时,又该怎样移动圆盘呢?

当 N = 2 时

 我们可以先将最上面的圆盘先移到B中,再将底部圆盘移到C中,最后将B柱中的圆盘移到C中,此过程示意图如下

 

将顶部圆盘移到B柱中 

将底部圆盘移到C柱中 

将B中圆盘移动到C柱中,完成整个汉诺塔过程 

 在此过程中,我们可以将顶部圆盘的移动过程看作为借助B柱移动到C柱

 而底部圆盘的移动过程看作直接从A柱移动到C柱

当 N = 3 时 

 那么当N = 3 时,我们又该如何解决汉诺塔问题呢?同样的方式,我们借助图像来进行理解

 当 N = 3 时,我们可以适当运用整体思想,将底部圆盘看作一个个体,将除底部圆盘的之外的圆盘看作第二个圆盘,那么移动过程可用下图表示

 那么,当我们有N个圆盘时也可以运用上述思路来进行解决

 我们令底部圆盘为第N个圆盘,其余圆盘为N-1个,先将N-1个进行移动,再移动底部圆盘,移动N-1个圆盘后再对这N-1个圆盘进行同样的拆分,最终实现了汉诺塔问题

在C语言中,我们可以用函数递归来实现上述思路

用代码实现汉诺塔问题

#include<stdio.h>

void move(char A, char C, int n)
{
 printf("把第%d个圆盘从%c--->%c\n", n, A, C);
}

void HanoiTower(char A, char B, char C, int n)
{
 if (n == 1)
 {
  move(A, C, n);
 }
 else
 {
  //将n-1个圆盘从A柱借助于C柱移动到B柱上
  HanoiTower(A, C, B, n - 1);
  //将A柱子最后一个圆盘移动到C柱上
  move(A, C, n);
  //将n-1个圆盘从B柱借助于A柱移动到C柱上
  HanoiTower(B, A, C, n - 1);
 }
}

int main()
{
 int n = 0;
 printf("输入A柱子上的圆盘个数:");
 scanf("%d", &n);
 //将n个圆盘从A柱借助于B柱移动到C柱上
 HanoiTower('A', 'B', 'C', n);
 return 0;
}

总结

对于类似于汉诺塔问题的一类题目,我们都可以用从特殊到一般的思想来解决,然后在编写C语言代码的时候用函数的递归来实现这一算法,许多问题便迎刃而解了

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

C语言 递归实现汉诺塔问题 【图文讲解、简单易懂】 的相关文章

随机推荐

  • Apache License 2.0

    Apache License 2 0 是 Apache 软件基金会发布的开源软件许可证 它是一种宽松的 允许商用的许可证 适用于开源项目和商业项目 Apache 2 0 许可证是一个相对较新的版本 于2004年发布 取代了早期的 Apach
  • 决策树——信息熵,条件熵,信息增益

    1 信息熵 信息熵是度量样本集的纯合度的一种常用的指标 熵值越大 随机变量的不确定性越高 比如 0 0 01 1 1 1 1 2 3 4 5 6 7 在这两组数据中 上面的数据的不确定性要小 只有两种可能性 抽中的数字2的概率为1 2 所以
  • overleaf写论文笔记(latex)

    overleaf官网 www overleaf com overleaf中文版 cn overleaf com 目录 从零开始 获取模板 文章标题修改 作者修改 摘要 页脚文字重叠 遮挡 三线表绘制 表格内单元格合并 不同行列数不同 文字加
  • 黑盒、白盒、灰盒,如何选择合适的模糊测试工具?

    在软件开发和安全领域 模糊测试是一种常用技术 用于发现应用程序或系统中的潜在漏洞和安全弱点 选择不同的模糊测试方法将极大地影响测试的有效性和效率 本文将比较对比黑盒 白盒和灰盒模糊测试的特点和优势并提供选型指导 模糊测试的分类 黑盒模糊测试
  • JDBC学习笔记一之JDBC的下载、引用、标准api介绍

    1 下载MySQL的JDBC驱动jar包 进入MySQL官网 https www mysql com 然后按图操作 2 下载Oracle的JDBC驱动jar包 按图提示操作 2 1引用Oracle的JDBC驱动jar包 2 2 Oracle
  • 软件测试工程师工作有多累?怎么入门学习软件测试呢?

    软件测试随着时间的发展 越来越受欢迎了 那么 你了解过软件测试吗 软件测试工程师工作累吗 跟随千锋一起来了解一下吧 1 其实IT行业都需要经常加班的 所以软件测试和软件开发其实都一样 当然了 一般来说开发会更累一点 2 目前国内软件测试的待
  • neo4j 内存介绍

    描述Neo4j内存配置和使用的不同方面 内容翻译neo4j 操作手册 1 总览 1 1 操作系统内存 必须保留一些内存以运行操作系统本身的进程 不可能显式配置应为操作系统保留的RAM数量 因为这是在配置页面缓存和堆空间之后仍保持可用的RAM
  • 遍历子文件编码格式互换(UTF-8与GB2312)

    遍历子文件编码格式互换 UTF 8与GB2312 在日常开发中 我们经常会遇到需要将文件的编码格式从一种转换为另一种的情况 特别是在不同的操作系统和编辑器之间共享代码文件时 本篇文章将介绍一个Python脚本 用于遍历指定文件夹下的所有 c
  • 12月9号实验报告四

    完成apache服务器能够使用php解析 phtml php3 第一步 先修改配置文件httpd conf 添加 phtml php3 第二步 创建 phtml文件 php3文件 第三步 验证 phtml文件 php3文件
  • MyBatis(四) 主键生成策略

    1 数据库支持自动生成主键 若数据库支持自动生成主键的字段 比如 MySQL和 SQL Server 则可以设置useGeneratedKeys true 然后再把keyProperty 设置到目标属性上 mysql 支持自增主键 自增主键
  • Python3入门基础(10)一个对象

    Python3 面向对象 面向对象技术 与 Java 类似 类 Class 用来描述具有相同的属性和方法的对象的集合 它定义了该集合中每个对象所共有的属性和方法 对象是类的实例 方法 类中定义的函数 类变量 类变量在整个实例化的对象中是公用
  • discuz手机端默forum.php,discuz手机wap版模板开发方式简述

    近期项目需要对discuz论坛的手机模板进行开发调整 在官方论坛和搜索引擎找了很久 都没有找到相应的文章 只好自己着手开始研究 手机模板文件的所在目录 template default mobile 手机模板文件的主目录 template
  • 用Python+PIL将多个jpg图像批量合并成一个pdf文件

    一 引言 在 用Python PIL将目录下jpg图像批量转成pdf文件 介绍了将一个目录下所有的jpg文件批量转成一对一的pdf文件的方法 但单位后来又要求将所有图片合并到一个PDF中看 在实际工作中 确实有时还需要将批量图片文件合并生成
  • 用于视觉跟踪的在线特征选择研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现 1 概述 视觉跟踪是计算机视觉中的重要任务之一 它涉
  • QQuickWidget + QML编程实现酷炫动态动画效果

    1 具体需求 当Qt开发项目中需要实现简单的动态酷炫动画效果时 我们可以使用Qt中的QQuickWidget来实现 同时还可以使用QML编程来实现具体的动画效果 具体实现的效果如下所示 2 具体操作和实现效果图 1 按下start按钮 音乐
  • 解决win10运行Android Studio卡死问题

    问题 最近window来了一波强制更新 然后我发现在Android Studio内点运行 很容易就卡死在install处 完全不能动 只能在任务管理器上杀进程 用了很多办法都没解决 最后还是觉得是杀软的问题 处理了一下 解决办法 第一个办法
  • Python TimedRotatingFileHandler 多进程环境下的问题和解决方法

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 问题 Python 自带了一个 handler 可以实现每天自动切割日志文件的功能 其实支持各种按时间切割的方法 不过按日期切割是最常用的一种 切割 这件事的触发和执行逻辑
  • springboot在使用Scheduled做定时任务出现Autowired注入空指针

    错误示范 以往的依赖注入直接使用 Autowired Autowired BrowseRecordsService browseRecordsService ApiOperation 清除过期的浏览记录 public void remove
  • 【业务功能篇36】Springboot+activiti7 工作流引擎

    业务场景 前段时间总结的有一个告警工单流程 我们都是直接自己建表 状态节点 操作节点 都是自定义设计的 而到后面会有很多的工单流程 比如创建一个遗留问题电子流 指定处理人进行分析闭环 等等多种电子流 后期重复的开发工作以及维护工作会越来越多
  • C语言 递归实现汉诺塔问题 【图文讲解、简单易懂】

    汉诺塔问题是我们在学习函数递归时常遇见的一类问题 那么如何用简单易懂的思路来解决汉诺塔问题呢 下面我会为大家进行讲解 目录 汉诺塔是什么 汉诺塔的来源 用C语言实现汉诺塔 汉诺塔问题分析思路 用代码实现汉诺塔问题 总结 汉诺塔是什么 汉诺塔