C语言 递归实现汉诺塔问题 【图文讲解、简单易懂】
汉诺塔问题是我们在学习函数递归时常遇见的一类问题,那么如何用简单易懂的思路来解决汉诺塔问题呢?下面我会为大家进行讲解
目录
汉诺塔是什么?
汉诺塔的来源
用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语言代码的时候用函数的递归来实现这一算法,许多问题便迎刃而解了
C语言 递归实现汉诺塔问题 【图文讲解、简单易懂】相关推荐
- c语言递归汉诺塔次数,c语言递归解决汉诺塔参数变化的疑惑
c语言递归解决汉诺塔参数变化的疑惑 答案:3 信息版本:手机版 解决时间 2020-04-05 14:20 已解决 2020-04-05 10:49 #include void main() {vo ...
- c语言递归解决汉诺塔问题
c语言递归解决汉诺塔问题 参考文章: (1)c语言递归解决汉诺塔问题 (2)https://www.cnblogs.com/didiaoxiaoguai/p/6686407.html 备忘一下.
- c语言递归求塔移动次数,c语言递归调用汉诺塔
递归算法的出发点不是由初始条件出发,而是把出发点放在求解的目标上,从所求的未知项出发逐次调用本身的求解过程,直到递归的边界(即初始条件). 汉诺塔问题的重点是分析移动的规则,找到规律和边界条件. 若需 ...
- C语言递归实现汉诺塔
汉诺塔 汉诺塔问题是指:一块板上有三根针 A.B.C.A 针上套有 64 个大小不等的圆盘,按照大的在下.小的在上的顺序排列,要把这 64 个圆盘从 A 针移动到 C 针上,每次只能移动一个圆盘,移动 ...
- C语言--实现汉诺塔【图文讲解,附代码】
目录 (1)什么是汉诺塔 (2)汉诺塔打印步骤 (3)如何用C语言实现汉诺塔 (4)实现代码 (1)什么是汉诺塔 汉诺塔(Tower of Hanoi),又称河内塔.源自印度古老传说的一个游戏,大 ...
- c语言 统计数量用count_C语言编程学习之递归实现汉诺塔图解!还有零基础入门视频~...
C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构.C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现 ...
- C语言——生存期和存储类型、递归、递归求解汉诺塔、快速排序
目录 一.生存期和存储类型 1.生存期 2.存储类型 3.自动变量(auto) 4.寄存器变量(register) 5.静态局部变量(static) 6.static 和 extern 二.递归 1. ...
- 汉诺塔c语言源程序步骤,汉诺塔问题的算法分析及C语言演示程序的实现
摘要:该文对经典的"汉诺塔"问题进行了详细的分析,并用C语言实现.通过问题的具体实现,使学习者了解问题的全过程,推广到一般. 关键词:汉诺塔;递归;C语言 中图分类号:TP301. ...
- c语言 汉诺塔游戏下载,使用C语言解决益智游戏——“汉诺塔”
说明: 文章所有内容截选自实验楼教程[3个C语言实例带你掌握递归方法论],教程里还有两个实例,感兴趣的可以点击查看: 文章主要是带你通过解决这个游戏来利用递归解决实际问题并掌握其核心思想,懂得如何使用 ...
最新文章
- textlive在安装完winedt的配置问题
- 乐山市计算机学校坑不坑,据说这个学校很乱。
- 基于WeUI的Angular2开发
- OGEngine_粒子效果
- ssh能够连接而sftp不能连接的解决方法
- OA中总结:s:select,关于使用modelDriven,项目分层,@Transactional,jspf,各个层上配置注解交给spring管理的方法,简单的OGNL表达式写法
- python中横向制表符_Python-“缩进中的制表符和空格使用不一致”
- mybatis学习(18):列名与属性名不一致的情况(使用ResultMap)
- 字符串匹配算法_4月16日活动预告|字符串匹配算法解析
- jenkins配置用户权限
- 中input标签赋值_Java程序员:Spring MVC JSP表单标签示例
- Java基础学习总结(116)——Map使用相关问题总结
- 51NOD-1027 大数乘法【大数】
- zmap扫描mysql_zmap使用笔记
- DIY的U盘量产CD-ROM做PE启动盘教程(银灿IS903-A4主控+东芝SLC颗粒)
- 龙芯2F装debian5
- 凸优化极简笔记(三):椭圆方程的矩阵形式
- 网页导出pdf不完整_怎么把pdf文件导出为图片?支持导出什么图片格式?
- 工作中那些让人印象深刻的BUG(2)
- 《声声慢·寻寻觅觅》 李清照