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

首先我们肯定是把上面n-1个盘子移动到柱子C上,然后把最大的一块放在B上,最后把C上的所有盘子移动到B上,由此我们得出表达式:
H⑴ = 1
H(n) = 2H(n-1)+1 (n>1)
那么我们很快就能得到H(n)的一般式:
H(n) = 2^n - 1 (n>0)
并且这种方法的确是最少次数的,证明非常简单,可以尝试从2个盘子的移动开始证,你可以试试。
进一步加深问题(解法原创
_):
假如现在每种大小的盘子都有两个,并且是相邻的,设盘子个数为2n,问:⑴假如不考虑相同大小盘子的上下要多少次移动,设移动次数为J(n);⑵只要保证到最后B上的相同大小盘子顺序与A上时相同,需要多少次移动,设移动次数为K(n)。
⑴中的移动相当于是把前一个问题中的每个盘子多移动一次,也就是:
J(n) = 2
H(n) = 2*(2^n - 1) = 2^(n+1)-2
在分析⑵之前
,我们来说明一个现象,假如A柱子上有两个大小相同的盘子,上面一个是黑色的,下面一个是白色的,我们把两个盘子移动到B上,需要两次,盘子顺序将变成黑的在下,白的在上,然后再把B上的盘子移动到C上,需要两次,盘子顺序将与A上时相同,由此我们归纳出当相邻两个盘子都移动偶数次时,盘子顺序将不变,否则上下颠倒。
现在回到最开始的问题,n个盘子移动,上方的n-1个盘子总移动次数为2H(n-1),所以上方n-1个盘子的移动次数必定为偶数次,最后一个盘子移动次数为1次。
讨论问题⑵,
综上两点,可以得出,要把A上2n个盘子移动到B上,首先可以得出上方的2n-2个盘子必定移动偶数次,所以顺序不变,移动次数为:
J(n-1) = 2^n-2
然后再移动倒数第二个盘子,移动次数为2
J(n-1)+1 = 2^(n+1)-3,
最后移动最底下一个盘子,所以总的移动次数为:
K(n) = 2*(2J(n-1)+1)+1 = 2(2^(n+1)-3)+1 = 2^(n+2)-5
开天辟地的神勃拉玛(和中国的盘古差不多的神吧)在一个庙里留下了三根金刚石的棒,第一根上面套着64个圆的金片,最大的一个在底下,其余一个比一个小,依次叠上去,庙里的众僧不倦地把它们一个个地从这根棒搬到另一根棒上,规定可利用中间的一根棒作为帮助,但每次只能搬一个,而且大的不能放在小的上面。计算结果非常恐怖(移动圆片的次数)大约是1.84467440*10^19,众僧们即便是耗尽毕生精力也不可能完成金片的移动了。
算法介绍
其实算法非常简单,当盘子的个数为n时,移动的次数应等于2^n – 1(有兴趣的可以自己证明试试看)。后来一位美国学者发现一种出人意料的简单方法,只要轮流进行两步操作就可以了。首先把三根柱子按顺序排成品字型,把所有的圆盘按从大到小的顺序放在柱子A上,根据圆盘的数量确定柱子的排放顺序:若n为偶数,按顺时针方向依次摆放 A B C;
若n为奇数,按顺时针方向依次摆放 A C B。
⑴按顺时针方向把圆盘1从现在的柱子移动到下一根柱子,即当n为偶数时,若圆盘1在柱子A,则把它移动到B;若圆盘1在柱子B,则把它移动到C;若圆盘1在柱子C,则把它移动到A。
⑵接着,把另外两根柱子上可以移动的圆盘移动到新的柱子上。即把非空柱子上的圆盘移动到空柱子上,当两根柱子都非空时,移动较小的圆盘。这一步没有明确规定移动哪个圆盘,你可能以为会有多种可能性,其实不然,可实施的行动是唯一的。
⑶反复进行⑴⑵操作,最后就能按规定完成汉诺塔的移动。
所以结果非常简单,就是按照移动规则向一个方向移动金片:
如3阶汉诺塔的移动:A→C,A→B,C→B,A→C,B→A,B→C,A→C
汉诺塔问题也是程序设计中的经典递归问题,下面看一下源码。

// An highlighted block
#include <stdio.h>
#include <string.h>
/*解题思路:1将 n-1个盘子先放到B座位上2.将A座上地剩下的一个盘移动到C盘上3、将n-1个盘从B座移动到C座上
*/
//函数原型声明
void move(char x, char y);
void hannuo(int n,char one ,char two,char three)
{void move(char x,char y);if(n==1)move(one, three); //如果此时one就一个盘子,就直接移动到three上else
{hannuo(n-1,one ,three,two); //否则就在One的基础上留下最后一个盘子,One借助three移动到two上move(one,three);  //在把one里最后一个大盘子移动到three上边hannuo(n-1,two,one,three);  //最后把two里的盘子,借助one依次放进three里}
}
void move(char x,char y)
{printf("%c--->%c",x,y)  //直接输出一下
}void main()
{int n;
printf("input your number");  //接收输入
scanf("%d",&n);
hannuo(n,'A','B','C');  //在这里调用函数
return 0;
}

汉诺塔递归调用(C语言实现)有三根相邻的柱子,标号为A,B,C,A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘,要把所有盘子一个一个移动到柱子B上,并且每次移动同一根柱子上都不能出现大盘子在小盘相关推荐

  1. 汉诺塔递归的c语言实现(递归)

    对于递归来讲, 汉诺塔实际是经典到不能再经典的例子了,   每个数据结构的教材对会提到. 但是到最后只给出一段类似下面的一段代码: #include<stdio.h>void move(i ...

  2. 数据结构之栈与递归的应用(汉诺塔递归解法)

    上一节简单的讲述了递归的实现与简单应用,接下来我们说一下另一个经典应用. 汉诺塔递归解法 一.起源: 汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子, ...

  3. 汉诺塔递归与非递归实现

    汉诺塔递归与非递归实现 背景介绍 汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64 ...

  4. java汉诺塔递归算法_数据结构--汉诺塔递归Java实现

    1 /*汉诺塔递归2 * 1.将编号0-N-1个圆盘,从A塔座移动到B上面3 * 2.将编号N的1个圆盘,从A移动到C上面4 * 3.最后将B上面的N-1个圆盘移动到C上面5 * 注意:盘子的编号从上 ...

  5. 青蛙跳台(含变种)及汉诺塔递归,母牛生小牛

    青蛙跳台(含变种)及汉诺塔递归,母牛生小牛 文章目录 青蛙跳台(含变种)及汉诺塔递归,母牛生小牛 #define _CRT_SECURE_NO_WARNINGS #include<Windows ...

  6. 算法分析:傻瓜式理解汉诺塔递归问题

    算法分析:傻瓜式理解汉诺塔递归问题 一.汉诺塔问题规则 设a.b.c是三个塔座, 开始时,a上有n个圆盘自下而上,从大到小地叠放在一起. 现要求将a上的圆盘移到b上,仍按相同顺序叠放 规则1:每次只能 ...

  7. 汉诺塔递归Python实现

    大二学习数据结构的时候知道了汉诺塔问题,由于当时不求甚解对这个问题没真正理解.今天学习廖雪峰python教程遇到了递归实现汉诺塔的练习,这才终于真正理解了汉诺塔递归的问题. 汉诺塔问题:有三个柱子A, ...

  8. 汉诺塔递归 C语言 代码简洁

    #include<stdio.h> void hannuota(int n,char A,char B,char C) {if(1==n) printf("将编号为%d的盘子从% ...

  9. c语言函数汉诺塔不用move,C语言——汉诺塔问题(函数递归)

    问题概述:古代有一个梵塔,塔内有3个座A,B,C.开始时A座上有64个盘子,盘子大小不等,大的在下,小的在上,有一个老和尚想把64个盘子从A座移动到C座,但是规定每次只允许移动一个盘,且在移动过程中在 ...

最新文章

  1. mac怎么合并两个容器_PDF怎样合并?在Mac上合并PDF文件的最佳方法
  2. SQL:waitfor的使用
  3. 10-2 5-2 查询至少生产两种不同的计算机(PC或便携式电脑)且机器速度至少为133的厂商 (20 分)(思路加详解+测试用例)
  4. 【渝粤题库】陕西师范大学100071教育学作业(高起本)
  5. 本地提交spark_Spark 数据本地化级别
  6. 【英语学习】【English L06】U06 Banking L2 A savings account sounds better for me
  7. 短视频成青少年教育新工具:抖音等三机构联合发起“青椒计划”
  8. 201703-1-分蛋糕
  9. Android O版本power按键锁屏亮屏流程
  10. 用html5做一个视频网页,如何使用HTML5在网页上制作交互式视频?
  11. pyopenpose文档
  12. php实用教程第3版郑阿奇课后答案_PHP实用教程(第3版)
  13. 腾讯云主机linux(centos7)服务器基本操作和安装日志
  14. 手机异步发送短信验证码解决方案-Celery+redis
  15. 职称计算机CAD好学吗,2017职称计算机CAD练习试题及答案.pdf
  16. 互联网时代下的十大商业模式
  17. Dreamweaver8安装后无法启动
  18. 三叶草考试模拟系统服务器,三叶草学考模拟系统
  19. flash特效原理:倒影效果
  20. keepass2Android密码,Keepass2Android密码管理

热门文章

  1. ICP算法实现(MATLAB改良版)
  2. 【驾考】从报名到放弃
  3. linux分区,硬盘大于2T
  4. 自定义webjars
  5. CUDA---从入门到升华
  6. PostgreSQL编码格式:客户端服务器、客户端、服务器端相关影响
  7. 点计算机级别怎么分高低配,电脑怎么判断配置高低
  8. 计算机图形学 几何概论
  9. 广东迅视 小年有哪些习俗
  10. 图形流水线中坐标变换详解:模型矩阵、视角矩阵、投影矩阵