一个经典的汉诺塔问题,带着我自己的理解给做这个问题的友友们解决一下,包括我本人在做的时候也遇到的一些问题给大家阐述一下。话不多说,来看:

汉诺塔

问题描述:

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


分析问题:

将a柱上的盘子,借助b柱移动到c柱上

初次接触类似的问题,乍看之下肯定会感觉无从下手,不如先分析一个容易一点的,假设a柱上只有三个盘子

如要实现转移则一共需要7步:

1.先将最上面的盘子移动到c柱上;

2.将中间的盘子移动到b柱;

3.再将c柱上的盘子移动到b柱上;

4.再将a柱上最后一个盘子移动到c柱上;

5.再将b柱上最上面盘子移动到a柱上;

6.再把b柱上的盘子移动到c柱;

7.再将a柱上的盘子移动到c柱上

只有3个盘子看似不难,实际上随着盘子数的增加,需要的步数会沿着2的n次方减1曲线增加;

如果真的要把64个圆盘从a柱子移动到c柱子上,第一步应该怎么做?虽然可以肯定,第一步唯一的选择是移动a最上面的那个圆盘,但是应该将其移到b还是c呢?很难确定。因为接下来的第二步、第三步……直到最后一步,看起来都是很难确定的。能立即确定的是最后一步:最后一步的盘子肯定也是a最上面那个圆盘,并且是由a或b移动到c——此前已经将63个圆盘移动到了c上。

也许你会说,管他呢,先随便试着移动一下好了。如果你这么做,你会发现,接下来你会面临越来越多类似的选择,对每一个选择都“试”一下的话,你会偏离正确的道路越来越远,直到你发现你接下来无法进行为止。

如果将这个问题的盘子数量减为10个或更少,就不会有太大的问题了。但盘子数量为64的话,你一共需要移动约1800亿亿步(18,446,744,073,709,551,615),才能最终完成整个过程。这是一个天文数字,没有人能够在有生之年通过手动的方式来完成它。即使借助于计算机,假设计算机每秒能够移动100万步,那么约需要18万亿秒,即58万年。将计算机的速度再提高1000倍,即每秒10亿步,也需要584年才能够完成。


解决问题:

当我看到这个问题时我脑子里想了3个盘子的情况和4个盘子的情况,当有4个盘子的时候需要15步这时候光想就已经混乱了,我借助了画图,同时也发现了不管是最初a柱上有几个盘子在移动过程中都有一个共同点就是将除了a柱最下面的一个盘子以外的盘子全部移动到b柱上

所以这么复杂的过程,我们可以拆解一下

假设a柱上有n个盘子,如要实现移动则需要

1.把a柱n-1个盘子借助c柱移动到b柱

2.再把a柱上第n个盘子移动到c柱

3.把b柱上的n-2个盘子借助c柱移动到a柱上

4.再把b柱上最后一个盘子移动到c柱上

.以此类推>>>直到全部移动到c柱上

看到这我想聪明的友友你们已经发现规律了,即每次都是先将其他圆盘移动到辅助柱子上,并将最底下的圆盘移到c柱子上,然后再把原先的柱子作为辅助柱子,并重复此过程。

这个过程称为递归,即定义一组基本操作,这组操作将规模小一点(或大一点)的操作当做一个整体——无需关心它的细节,只当它已经完成了——然后执行剩下的操作。而在更小或更大的规模中也依此操作,直到规模达到预定值

因此,可以用递归的方法来解决这一复杂的问题

我们假设函数Hanoi(n, t1,t2, t3)用于将n个圆盘由t1移动到t3,t2作为辅助柱子。那么我们可以这样实现这个递归过程:

void Hanoi(int x,char t1,char t2,char t3)
{if (x == 1){move(x, t1, t3);//(move函数是移动最下面的一个盘子)}else{Hanoi(x - 1, t1, t3, t2);//1柱x-1个盘子移动到2柱,3柱为辅助柱(注意参数顺序)move(x, t1, t3);//第x个盘子从1柱移动到3柱Hanoi(x - 1, t2, t1, t3);//将x-1个盘子从2移动到3,1柱为辅助柱}
}

Tower of Hanoi(汉诺塔)详解相关推荐

  1. C++Tower of Hanoi汉诺塔的实现算法(附完整源码)

    C++Tower of Hanoi汉诺塔的实现算法 C++Tower of Hanoi汉诺塔的实现算法完整源码(定义,实现,main函数测试) C++Tower of Hanoi汉诺塔的实现算法完整源 ...

  2. 算法笔记 —— 汉诺塔详解

    文章目录 一.问题来源 二.小游戏体验 三.思路分析 四. 程序实现 一.问题来源 相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏.该游戏是在一块铜板装置上,有三根杆(编号X.Y.Z),在 ...

  3. 汉诺塔详解(包看包会)

    CSDN的大佬已经解释了很多了,由我这个菜鸟反复理解后得到的一些心得的分享 先看题: 汉诺塔: 汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根 ...

  4. C语言 - 汉诺塔详解(最简单的方法,进来看看就懂)

    文章目录 一.什么是汉诺塔? 二.如何实现捏? 三.如何写代码? 四.为什么需要移动 2^n - 1 次/ 一.什么是汉诺塔? 汉诺塔起源于印度的一个古老传说,传说是什么不重要.重要的是它是怎么实现的 ...

  5. 汉诺塔详解(超详细)

    递归算法求汉诺塔(C语言版) 汉诺塔: 梵天创造世界的时候做了三根金刚石柱子,x y z三根柱子 在x柱子上 从上往下按照从小到大顺序摞着64片黄金圆盘. 梵天命令婆罗门把圆盘从x柱移到z柱 并且规定 ...

  6. 汉诺塔详解过程和递归思想及举例(python代码)

    省略问题描述- 但我们知道64个盘子的移动次数是18 446 744 073 709 551 615这是一个天文数字 解决办法: 我们最终解决的问题就是将a柱子原来由大到小从下到上排好序的圆盘通过b柱 ...

  7. python递归汉诺塔详解_汉诺塔在python中递归,理解磁盘目的地的变化

    我正在努力提高我对python中hanoi之塔递归解决方案代码的理解. 此代码:def moveTower(height,fromPole, toPole, withPole): if height ...

  8. Tower of Hanoi (汉诺塔问题)

    1.question: hanoi问题:有三根杆子A,B,C.A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小.要求按下列规则将所  有圆盘移至C杆:提示:可将圆盘临时置于B杆,也可将从 ...

  9. c语言递归求塔移动次数,【C语言】Hanoi(汉诺)塔问题,求移动盘子的步骤(递归法)...

    所有的循环算法都可以用递归实现,反之不成立,这足以证明递归的重要性! Hanoi(汉诺)塔问题.古代有一个焚塔,塔内有3个座A,B,C,开始时A座上有64个盘子,盘子大小不等,大的在上,小的在下,有一 ...

  10. Hanoi(汉诺)塔问题

    问题描述: Hanoi(汉诺)塔问题.古代有一个梵塔,塔内有3个座A,B,C,开始时A座有n个盘子,盘子大小不等,大的在下,小的在上.有一个老和尚想把这n个盘子,从A座移动到C座,但是每次只允许移动一 ...

最新文章

  1. 18.图像用户界面入门:EasyGui
  2. windows剪切板暂存
  3. 原生Aajax 和jQuery Ajax 写法个人总结(简单)
  4. MySQL 全文搜索支持, mysql 5.6.4支持Innodb的全文检索和类memcache的nosql支持
  5. sql alwayson群集 registerallprovidersip改为0_前沿观察 | 分布式SQL性能对比
  6. 那些年 iOS 升级踩过的坑!
  7. 项目期复习:JS操作符,弹窗与调试,凝视,数据类型转换
  8. Centos系统设置
  9. 地理信息地图标记KML与KMZ的区别
  10. windows10系统下以管理员身份进入CMD(命令提示符)的三种方法
  11. SSH连接GitHub并配置ssh key
  12. 如何开放云服务器端口
  13. 半小时读懂互联网广告新生态
  14. 东方式插花注重花材所表达的内容美
  15. 单片机控制74hc595驱动4个单数码管计数显示
  16. FPGA基础设计(二):任意分频器(奇数,偶数,小数)
  17. ansys 14.5 linux 安装教程,linux 安装 ansys14 - 计算模拟 - 小木虫 - 学术 科研 互动社区...
  18. cocos creator实例--CocosCreator实现的 解救人质 游戏,学会碰撞检测
  19. 史上最全的Android面试题集锦
  20. 网页中onbeforeunload、onpagehide、onunload、onload、onpageshow的正确执行顺序

热门文章

  1. 用uniapp开发打包多端应用完整指南
  2. android 广播的插件化
  3. Machine Learning Practical 爱宝课程记录week1
  4. pptpd mysql_pptpd+freeradius+mysql安装步骤
  5. C++中的peek()函数及其用法
  6. 水晶报表打印s删除数据
  7. flip game java_LeetCode 293. Flip Game
  8. ISO体系认证办理流程及所需资料
  9. Oracle查看ogg延时,OGG复制进程延迟不断增长
  10. c++实现maxpooling+利用OpenMP、SIMD优化代码