汉诺塔算法

汉诺塔问题递归算法分析:

递归实现了某种类型的螺旋状while循环。while循环在循环体每次执行时必须取得某种进展,逐步迫近循环终止条件。 递归函数也是如此,它在每次递归调用后必须越来越接近某种限制条件。当递归函数符合这个限制条件时,它便不在调用自身。

递归算法的特点

递归算法是一种直接或者间接地调用自身的算法。在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理解。 递归算法解决问题的特点:

(1) 递归就是在过程或函数里调用自身。

(2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。

(3) 递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不提倡用递归算法设计程序。

(4) 在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。所以一般不提倡用递归算法设计程序。 递归算法要求

递归算法所体现的“重复”一般有三个要求:

一是每次调用在规模上都有所缩小(通常是减半);

二是相邻两次重复之间有紧密的联系,前一次要为后一次做准备(通常前一次的输出就作为后一次的输入);

三是在问题的规模极小时必须用直接给出解答而不再进行递归调用,因而每次递归调用都是有条件的(以规模未达到直接解答的大小为条件),无条件递归调用将会成为死循环而不能正常结束。

一个庙里有三个柱子,第一个有64个盘子,从上往下盘子越来越大。要求庙里的老和尚把这64个盘子全部移动到第三个柱子上。移动的时候始终只能小盘子压着大盘子。而且每次只能移动一个。

1、此时老和尚(后面我们叫他第一个和尚)觉得很难,所以他想:要是有一个人能把前63个盘子先移动到第二个柱子上,我再把最后一个盘子直接移动到第三个柱子,再让那个人把刚才的前63个盘子从第二个柱子上移动到第三个柱子上,我的任务就完成了,简单。所以他找了比他年轻的和尚(后面我们叫他第二个和尚),命令:

① 你丫把前63个盘子移动到第二柱子上

② 然后我自己把第64个盘子移动到第三个柱子上后

③ 你把前63个盘子移动到第三柱子上

2、第二个和尚接了任务,也觉得很难,所以他也和第一个和尚一样想:要是有一个人能把前62个盘子先移动到第三个柱子上,我再把最后一个盘子直接移动到第二个柱子,再让那个人把刚才的前62个盘子从第三个柱子上移动到第三个柱子上,我的任务就完成了,简单。所以他也找了比他年轻的和尚(后面我们叫他第三和尚),命令:

① 你把前62个盘子移动到第三柱子上

② 然后我自己把第63个盘子移动到第二个柱子上后

③ 你把前62个盘子移动到第二柱子上

3、第三个和尚接了任务,又把移动前61个盘子的任务依葫芦话瓢的交给了第四个和尚,等等递推下去,直到把任务交给了第64个和尚为止(估计第64个和尚很郁闷,没机会也命令下别人,因为到他这里盘子已经只有一个了)。

4、到此任务下交完成,到各司其职完成的时候了。完成回推了:

第64个和尚移动第1个盘子,把它移开,然后第63个和尚移动他给自己分配的第2个盘子。

第64个和尚再把第1个盘子移动到第2个盘子上。到这里第64个和尚的任务完成,第63个和尚完成了第62个和尚交给他的任务的第一步。

从上面可以看出,只有第64个和尚的任务完成了,第63个和尚的任务才能完成,只有第2个和尚----第64个和尚的任务完成后,第1个和尚的任务才能完成。这是一个典型的递归问题。

/************************************************************************/

/*

现在我们以有3个盘子来分析:

第1个和尚命令:

① 第2个和尚你先把第一柱子前2个盘子移动到第二柱子。(借助第三个柱子) ② 第1个和尚我自己把第一柱子最后的盘子移动到第三柱子。

③ 第2个和尚你把前2个盘子从第二柱子移动到第三柱子。

很显然,第二步很容易实现(哎,人总是自私地,把简单留给自己,困难的给别人)。

其中第一步,第2个和尚他有2个盘子,他就命令:

① 第3个和尚你把第一柱子第1个盘子移动到第三柱子。(借助第二柱子) ② 第2个和尚我自己把第一柱子第2个盘子移动到第二柱子上。

③ 第3个和尚你把第1个盘子从第三柱子移动到第二柱子。

同样,第二步很容易实现,但第3个和尚他只需要移动1个盘子,所以他也不用在下派任务了。

(注意:这就是停止递归的条件,也叫边界值)

第三步可以分解为,第2个和尚还是有2个盘子,命令:

① 第3个和尚你把第二柱子上的第1个盘子移动到第一柱子。

② 第2个和尚我把第2个盘子从第二柱子移动到第三柱子。

③ 第3个和尚你把第一柱子上的盘子移动到第三柱子。

分析组合起来就是:1→3 1→2 3→2 借助第三个柱子移动到第二个柱子 |1→3 自私人留给自己的活| 2→1 2→3 1→3 借助第一个柱子移动到第三个柱子|共需要七步。

如果是4个盘子,则第一个和尚的命令中第1步和第3步各有3个盘子, 所以各需要7步,共14步,再加上第1个和尚的1步,

所以4个盘子总共需要移动 7+1+7=15步,

同样,5个盘子需要15+1+15=31步,6个盘子需要31+1+31=64步…… 由此可以知道,移动n个盘子需要(2的n次方)-1步。

从上面整体综合分析可知把n个盘子从1座(相当第一柱子)移到3座(相当第三柱子):

(1)把1座上(n-1)个盘子借助3座移到2座。

(2)把1座上第n个盘子移动3座。

(3)把2座上(n-1)个盘子借助1座移动3座。

下面用hanoi(n,a,b,c)表示把1座n个盘子借助2座移动到3座。

很明显:

(1)步上是 hanoi(n-1,1,3,2)

(3)步上是 hanoi(n-1,2,1,3)

用C语言表示出来,就是:

把第 1 个盘子 从 A座 搬到 C座

把第 2 个盘子 从 A座 搬到 B座

把第 1 个盘子 从 C座 搬到 B座

把第 3 个盘子 从 A座 搬到 C座

把第 1 个盘子 从 B座 搬到 A座

把第 2 个盘子 从 B座 搬到 C座

把第 1 个盘子 从 A座 搬到 C座

*/

/************************************************************************/

#include

#include

using namespace std;

//入参int n:代表第n个盘子

int move(int n,char a, char b)

{

printf("==>==>: 把第 %d 个盘子 从 %c座 搬到 %c座

\n\n",n,a,b);

return 0;

}

//入参int n:代表 共剩余n个盘子

int hanoi(int n,char a,char b,char c)

{

cout

if (n == 1)

{

cout}

else

{

cout}

if( n==1 )

{

cout: ";

move (1,a,c);

}

else

{

hanoi(n-1,a,c,b);//根据上面解说知道:移动n个盘子需要(2的n次方)-1步,这里需要移动n-1个盘子需要(2的n次方)-2步,也就是说这里的第一轮递归 要进行 n-1 层递归循环,才会结束调用,完成 将 n-1 个盘子从a座上借助c座,最终放到了b座上,

move(n,a,c);//完成 将 最后一个盘子即第 n 个盘子从a座上放到了c座上,至此完成第一轮的调用,其结果是将最后一个盘子完成了任务,其余的盘子都还在b座上放着呢,下面一步是对剩余的n-1个盘子进行新一轮的递归调用

hanoi(n-1,b,a,c);//开启新一轮的递归调用

};

if (n == 1)

{

cout}

else

{

cout}

cout

return 0;

}

int main()

{

freopen("hanoi.in","r",stdin);

freopen("hanoiOutPut.txt","w",stdout);

int num;

scanf("%d",&num);

cout

hanoi(num,'A','B','C');

cout

return 0;

}

开始

******************int hanoi(int n,char a,char b,char c) begin!!! 剩余盘子数 n=3,盘子在A座上,需借助B座,搬到C座

******************int hanoi(int n,char a,char b,char c) begin!!! 剩余盘子数 n=2,盘子在A座上,需借助C座,搬到B座

******************int hanoi(int n,char a,char b,char c) begin!!! 剩余盘子数 n=1,盘子在A座上,可以直接搬到C座

11111=>: ==>==>: 把第 1 个盘子 从 A座 搬到 C座

对应-----------剩余盘子数 n=1,盘子在A座上,可以直接搬到C座

int hanoi(int n,char a,char b,char c) end end end end end end @@@!!!@@@

==>==>: 把第 2 个盘子 从 A座 搬到 B座

******************int hanoi(int n,char a,char b,char c) begin!!! 剩余盘子数 n=1,盘子在C座上,可以直接搬到B座

11111=>: ==>==>: 把第 1 个盘子 从 C座 搬到 B座

对应-----------剩余盘子数 n=1,盘子在C座上,可以直接搬到B座

int hanoi(int n,char a,char b,char c) end end end end end end @@@!!!@@@

对应-----------剩余盘子数 n=2,盘子在A座上,需借助C座,搬到B座

int hanoi(int n,char a,char b,char c) end end end end end end @@@!!!@@@

==>==>: 把第 3 个盘子 从 A座 搬到 C座

******************int hanoi(int n,char a,char b,char c) begin!!! 剩余盘子数 n=2,盘子在B座上,需借助A座,搬到C座

******************int hanoi(int n,char a,char b,char c) begin!!! 剩余盘子数 n=1,盘子在B座上,可以直接搬到A座

11111=>: ==>==>: 把第 1 个盘子 从 B座 搬到 A座

对应-----------剩余盘子数 n=1,盘子在B座上,可以直接搬到A座

int hanoi(int n,char a,char b,char c) end end end end end end @@@!!!@@@

==>==>: 把第 2 个盘子 从 B座 搬到 C座

******************int hanoi(int n,char a,char b,char c) begin!!! 剩余盘子数 n=1,盘子在A座上,可以直接搬到C座

11111=>: ==>==>: 把第 1 个盘子 从 A座 搬到 C座

对应-----------剩余盘子数 n=1,盘子在A座上,可以直接搬到C座

int hanoi(int n,char a,char b,char c) end end end end end end @@@!!!@@@

对应-----------剩余盘子数 n=2,盘子在B座上,需借助A座,搬到C座

int hanoi(int n,char a,char b,char c) end end end end end end @@@!!!@@@

对应-----------剩余盘子数 n=3,盘子在A座上,需借助B座,搬到C座

int hanoi(int n,char a,char b,char c) end end end end end end @@@!!!@@@

结束


相关文章

  • 用人单位给计算机系学生的一封信
  • 今天上午又去招聘了,加上前面一段时间的招聘经验,有些话不吐不快. 我们希望找到能干活的人,就是能编程序的人,但是我感觉现在刚毕业的人里面,包括名校的,能干活的人比例非常的低,大概不超过百分之一. 很多人都说,没有参加过实际的项目,没有经验, ...

  • 德国会展业发展概况
  • 一.国家的重视与政策扶持 德国的政治制度是议会共和制度,它对会展业的管理模式是政府主导型. 德国联邦经济科技部每年都对出国展览提供直接的财政支持.而且会通过特定的组织或机构,组织德国企业赴国外参加展览会.当地的会展公司往往拥有自己的大型会展 ...

  • 论法国启蒙思想家的宗教批判
  • 论法国启蒙思想家的宗教批判 刘小英 R6sm砸:ApartirdeVoltaire,lespenseursfranqaisdesLumi色resat-taquaientlareligionparunecritiquequiena6branl ...

  • 世界著名会展城市
  • 1.德国汉诺威展览中心汉诺威展览中心是世界上最大的展览设施.这座世界最大的展览场拥有完美的基础设施和艺术级的技术手段.它为26000余位展商和230万观众的年流量而设计.整个场地占地100万平方米,共27个展馆,室内展览面积达到49.8万平 ...

  • 赴欧会展旅游考察报告
  • 赴欧会展旅游考察报告 2004年4月18日——2004年4月29日,杭州市会议展览业协会考察团赴西欧法国、德国、意大利、荷兰、比利时、奥地利、卢森堡、摩纳哥八国考察旅游业、会展业的发展状况。这次考察的地区是当今世界上旅游和会展业最为发达的地 ...

  • 英格兰君王币章介绍(一)
  • 英国为大不列颠及北爱尔兰联合王国的简称.位于欧洲西部大西洋中的岛国,与德国.荷兰.比利时.法国隔海相望.国土面积244,100平方公里.英国在公元前后为罗马人所统治.此后斯堪纳维亚的北欧海盗不断侵扰,将不列颠人驱逐至苏格兰与威尔士.11世纪 ...

  • 如此知名的大学 有哪些德国留学专业可选!
  • 如此知名的大学 有哪些德国留学专业可选?! 要说起知名的德国大学,我们就不得不提起 亚琛工业大学.柏林工业大学.莱布尼茨-汉诺威大学.不伦瑞克工业大学.达姆施达特工业大学.德累斯顿工业大学.卡尔斯鲁厄理工学院.慕尼黑工业大学.斯图加特大学这 ...

  • 关于世博会的知识问答
  • 世博会知识竞赛题(附答案) 1.埃菲尔铁塔是法国巴黎世博会的主题塔. A.1867年 B.1878年 C.1889年D.1900年 2.在汉诺威世博会上中国馆展出了大型重点工程. A.西气东输工程 B.青藏铁路 C.三峡工程D.南水北调工程 ...

  • 历史上的国家形式
  • 历史上著名的复合制国家例谈 复合制国是指由若干成员邦.州或国联合组成的联合国家或国家联合.按照其联系的紧密性可以分为君合国.邦联.政合国和联邦. 1. 君合国 君合国是指两个独立的主权国家由于共同拥戴一个君主而形成的一个国家联合,所以又称身 ...

  • 如何有效地应对冷场
  •   演讲的冷场分为两种情况:一种是单向交流中,听的人毫无兴趣,注意力分散;另一种是双向交流中,听者毫无反应,或者仅以简单的单音字节应付。这种场面的出现,根本原因就在于发言者的话没有吸引力。听者仅仅是出于纪律的约束或处世的礼貌而扮演一个“接受 ...

© 2024 范文参考网 | 联系我们 webmaster# 12000.net.cn