通俗易懂的解释~

游戏规则:

有A,B,C三根针,将A针上N个从小到大叠放的盘子移动到C针,一次只能移动一个,不重复移动,小盘子必须在大盘子上面。

问题:

总的移动次数是多少?

分析:

首先明确,我们的目标是将A针上所有N个盘子移动至C针。而对于B针,我们可以将之看成一个中转站。

这个问题,顺向思维或者逆向思维道理是相同的,都太麻烦。我们不妨从中间开始思考

||: 规则要求小盘子必须在大盘子之上。试想这个过程中,必然会经历那么一个步骤,即有一大坨N-1个盘子在B针这个中转站,而我们正将最大那个盘子(即第N个盘子)从A针移动至C针。

只有经历“移动最大盘子”这个步骤,余下的事情才有可能实现。而在此之前,我们所要做的事情,就是让“移动最大盘子”这个步骤得以实现。

现在,游戏整个过程以“移动最大盘子”为中央,被分为了两部分。即(前)“将那坨N-1个盘子从A针移动到B针”,(中)“移动最大盘子”,(后)“将坨N-1个盘子从B针移动到C针”。

这是我们意识到,(前)与(后)操作道理是相似的。不去管那个最大盘子,(前)是以C针为中转站,(后)是以A针为中转站。因此两者所需的移动次数应当是相等的。这意味着我们只要计算出其中一者的移动次数,然而乘以2,在加上“移动最大盘子”的那1次,就是这场游戏的总移动次数了。

用数学语言表达,假设(前)“将N-1个盘子从A针移动到B针”所需次数为Hn-1,总移动次数为Hn,那么可以得出的关系就是:Hn=(Hn-1)x 2 + 1.

其实当我们得出这个算式的时候,稍微聪明一点的人已经明白,这就是一个递推公式,可以直接用此公式得出Hn的通解。

但是LZ比较笨,就是不明白,为什么这个公式就可以套用呢?

那么就干脆继续思考吧。

让我们再想象一个情景:最大那个盘子在刚刚从A针被移动到C针,而那坨N-1个盘子还在B针蠢蠢欲动地等待着,即处于(中)->(后)的这个状态。

怎么移动这N-1个盘子呢?

其实这时候,问题已经回到了笔者标示“||:”符号的地方。“||:”是乐谱中的反复记号,而我们要做的,就是重复上面的步骤,但是要将N替换为N-1,因为现在只剩下N-1个盘子需要移动。而中转站则从B变成了A(鉴于这时盘子都在B针)。目标仍然是C针。下一次重复的时候,只剩下N-2个盘子需要移动,中转站又回到B,目标不变仍然是C针。……整个过程中,变化的只是中转站(在A与B之间轮换),以及剩下那些所需要移动的盘子的总数(越来越少)而已。

那么那个大盘子怎么办?不去管它吗??

正解!!

因为你已经把它移到C针,已经完成了这个移动步骤,它不会影响之后的操作。提醒自己牢记游戏规则,大盘子永远在小盘子下面,而你也不需要再重复移动它——“不重复移动”,正是游戏规则的要求!

于是
Hn=Hn-1 x 2 + 1 这个公式,就可以套用、套用、套用……直到H3=7,H2=3,H1=1。

最后,用最懒的数学归纳法证明通项公式
Hn = 2^n - 1 吧!没办法,LZ就是比较懒嘛~

代码实例

//汉诺塔
#include <stdio.h>void hannuota(int n, char A, char B, char C)
{/*如果是一个盘子,直接将盘子将a移到c否则先将a柱子上面的n-1个盘子借助c移到b,然后直接将a柱子上的盘子从A移到c,最后将b柱子上的n-1个盘子借助a移到c*/if(1 == n){printf("将编号为%d的盘子直接从%c柱子移到%c柱子\n",n, A, C);}else{hannuota(n-1, A , C , B);printf("将编号为%d的盘子直接从%c柱子移到%c柱子\n",n, A, C);hannuota(n-1, B, A, C);}
}
int main(void)
{char ch1 = 'A';char ch2 = 'B';char ch3 = 'B';int n;printf("请输入要移动盘子的个数:");scanf("%d", &n);hannuota(n, 'A', 'B', 'C');return 0;
}

参考自:
YIHE陳

Hanoi 汉诺塔——通俗易懂地讲解(c++)相关推荐

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

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

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

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

  3. Hanoi(汉诺)塔问题

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

  4. C语言---移盘子----Hanoi(汉诺)塔问题,显示移动盘子的步骤

    C语言-移盘子----Hanoi(汉诺)塔问题,显示移动盘子的步骤 在学习递归的过程中,Hanoi(汉诺)塔问题是避开不了的,很多新手在这儿一脸懵. 我们先简单介绍一些Hanoi(汉诺)塔问题到底是个 ...

  5. 递归算法以及Hanoi(汉诺)塔问题及其详细解释

    递归在算法中是非常重要的,可以说几乎所有的循环算法都可以用递归来实现,这足以体现递归的重要性,利用递归的条件一般为一下: 定义是递归的 像有些数学函数就是递归定义的,例如大家熟悉的阶层函数: 2.利用 ...

  6. Ka的递归编程练习 Part4|Hanoi汉诺塔,双色汉诺塔的也有

    1 #include <stdio.h> 2 void hanoi(int s,char a,char b,char c) //a是出发盘,b是中途盘,c是结束盘 3 { 4 if(s== ...

  7. 1-算法-hanoi汉诺塔问题- 递归

    汉诺塔问题用递归解决 问题抽象 递归都是从最原始的地方回溯 到解决这个大问题 Void hanoi(int n,char A,char B,char C) {if(n == 1) move(1,A,C ...

  8. C语言--实现汉诺塔【图文讲解,附代码】

    目录 (1)什么是汉诺塔 (2)汉诺塔打印步骤 (3)如何用C语言实现汉诺塔 (4)实现代码 (1)什么是汉诺塔   汉诺塔(Tower of Hanoi),又称河内塔.源自印度古老传说的一个游戏,大 ...

  9. 汉诺塔问题个人讲解及部分实现(JAVA递归)

    一.汉诺塔问题 古人往往很有智慧,解决传说中的难题.汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64 ...

最新文章

  1. tcpdump最简单用法
  2. 探讨ASP.NET 2.0中的Web控件改进技术(3)
  3. 远观近看阿里云ET平台 如何开启AI落地新风潮
  4. java 存储数据到文件中_本机速度文件支持的“纯” Java大数据存储
  5. 汇博工业机器人码垛机怎么写_全自动码垛机器人在企业生产中的地位越来越重要...
  6. python的excell库_Python中使用第三方库xlrd来写入Excel文件示例
  7. Linux平台中使用PHP让word转pdf
  8. C# winform post 请求指定 url
  9. 编程基础(二)——汇编
  10. 增强型植被指数EVI、ndvi数据、NPP数据、GPP数据、土地利用数据、植被类型数据、降雨量数据
  11. adc0808模数转换实验报告_adc0808模数转换电路图及程序
  12. 【论文笔记】ego_planner
  13. matlab julia分形图,Mandelbrot集和Julia集的分形图之matlab实现
  14. 计算机网络体系结构i层,1.2 计算机体系结构
  15. mac创建快捷新建文本方式
  16. InterValue正式启动主网映射
  17. Arrays中的asList注意的点以及解决方案
  18. IP数据报在各层的信息格式
  19. 我的showkey 刷挂了。
  20. 电信卡有信号移动卡无服务器,​电信卡信号怎么样?电信信号不好怎么办?

热门文章

  1. ogg mysql表结构不一致_OGG-01163 Bad column表结构一致、trail文件meta不一致处理
  2. c语言 结构体练习之 实现产品销售记录的相关功能
  3. git配置远程仓库,同时配置github、gitee、gitlab,完美解决方案
  4. 【Liunx】Linux 系统目录结构
  5. 145_Power BI Report Server自定义Form登录
  6. python3cookbook_python3-cookbook读书笔记(四)
  7. deepin20系统选择手动安装盘_深度系统Deepin 20最新正式版发布:全面升级
  8. Python网络爬虫开发实战,微博宫格验证码的识别
  9. 机器视觉与Tesseract介绍
  10. 原版英文书籍《Linux命令行》阅读记录3 | 解析文件的描述含义和阅读文件