汉诺塔c语言(共3篇)
汉诺塔c语言 篇1
汉诺塔c语言程序代码(通过vc++6.0验证)(附讲解)让我们先看看代码吧 #include
printf(“%d->%dn”,a,c);else {t=c;c=b;b=t;hj(a,b,c,i-1);printf(“%d->%dn”,a,b);t=a;a=c;c=t;t=b;b=c;c=t;hj(a,b,c,i-1);return 0;} } main(){ int a,b,c,i;a=1;b=2;c=3;printf(“请输入汉诺塔的盘数”);scanf(“%d”,&i);hj(a,b,c,i);return 0;}
以上是汉诺塔的代码,该程序主要是运用了递归的思想,比如数学中的f(x)=f(x-1)+f(x-2),在本程序中为:int hj(int a,int b, int c,int i){ int t;if(i==1)
printf(“%d->%dn”,a,c);else {t=c;c=b;b=t;hj(a,b,c,i-1);也就是说,我们在这个函数中再次调用这个函数,相当于一个循环,而在再次调用的过程中,i的值变成i-1,就类似于f(x-1),这样层层调用,最终就变成当i=1的时候的值,然后通过运算,计算出想要得到的值。汉诺塔的数值分析:
我们可以发现,当只有一个盘的时候,我们只需要做1->3(就是把第一个柱子上的最顶端的盘移动到第三根柱子,以下不再解释)当有两个盘的时候,是1->2
1->3
2->3 三个盘子是:1->3
1->2
3->2
1->3
2->1
2->3 分析一下可以得出以下结论: 初始值a=1 b=2 c=3 一个盘子就是a->c 两个盘子与一个盘子的关系是:
第一步:b与c交换值,然后打印a->c 第二步:打印a->b 第三步:a与c交换值,b与c交换值,打印a->c 进一步分析,便可以得出以下结论 只要盘子数量为i(i大于1),那么它就有三部分 第一部分,b与c交换值,然后运行i-1 第二部分,打印a->b 第三部分,a与c交换值,b与c交换值,然后运行i-1 程序表示便是: if(i==1)
printf(“%d->%dn”,a,c);else {t=c;c=b;(交换值)
b=t;hj(a,b,c,i-1);printf(“%d->%dn”,a,b);t=a;a=c;c=t;(a c交换)
t=b;b=c;c=t;(b c交换)
hj(a,b,c,i-1);不明加QQ765233918(请写清备注)
1->3
汉诺塔c语言 篇2
问题提出:
有三个塔(分别为A号,B号和C号)。开始时,有n个圆形盘以从下到上、从大到小的次序叠置在A塔上。现要将A塔上的所有圆形盘,借助B塔,全部移动到C塔上,且仍按照原来的次序叠置。移动的规则如下:这些圆形盘只能在3个塔间进行移动,一次只能移动一个盘子,且任何时候都不允许将较大的盘子压在比它小的盘子的上面。要求如下:从键盘输入初始圆形盘子个数n,用C语言实现n个盘子最佳移动的全过程。
2 算法分析
此题的目的是设计一个盘子移动的方案,使得A号塔上的所有盘子借助于B号塔按照原来的次序移动到C号塔上,并且,要给出完整的最佳的盘子移动的方案。
从实际的、具体的盘子的移动过程来分析,找出问题内在的规律。经分析,无论盘子的个数有多少,是1、2、3……或n个,也不管怎么去移动盘子(当然是按规则来移动),但在移动的过程中,将始终会出现这样的状态情况:(n-1)个盘子将会以从下到上、从大到小的次序叠置在B塔上,这时,A塔上第n个盘子就能被轻而易举地叠放到C塔上;接着,再把B塔上的共(n-1)个盘子移动到C塔上,问题好像已经解决。
但,B塔上(n-1)个盘子怎么移动到C塔上呢芽这是要解决的第二个问题。同样,不管我们怎么移动,也将会出现这样的状态情况:(n-2)个盘子将会以从上到下、从大到小的次序叠置在A塔上,这时,B塔上第(n-1)个盘子就能被轻而易举放到C塔上;接着,把A塔上的共(n-2)个盘子移动到C塔上。
这样,不断深入,不断细小化,最终,将到达仅有一个盘的情形,这时,递归也就终止了,问题也得到了解决。通过以上分析,这里有很明显的递归关系。
由此,想到了采用递归算法来解决该问题,因为递归算法有这样的特征描述:为了求解出规模为N的问题的解,先设法将它分解成一些规模较小的问题,然后从这些较小问题的解能方便地构造出大问题的解,并且这些规模较小的问题也能采用同样的方法分解,分解成规模更小的问题,并能从这些更小的问题的解构造出规模稍大问题的解。特别地是,当规模N=1时,能直接得到解。
现在,严格按照递归算法来解决问题。先定义递归方法han(int n,char one,char two,char three),按如下步骤进行解题(设初始盘子个数为N):若A塔上仅仅只有一个盘子(N=1),则直接从A移动到C,问题完全解决。若A塔上有一个以上的盘子(N>1),则需要考虑以下三个步骤。
第一步:把(N-1)个盘子从A塔经过移动,叠放到B塔上。在不违反规则情况下,所有(N-1)个盘子不能作为一个整体一起移动,而是要符合要求地从一个塔移到另一个塔上。用han(int n-1,char one,char two,char three)调用递归方法,注意:这里是借助于C塔,将(N-1)个盘子从A塔移动到B塔,A是源塔,B是目标塔。
第二步:将剩下的第N个盘子(也就是最底下的一个)直接从A塔叠放到空着的C塔上。
第三步:用第一步的方法,再次将B塔上的所有盘子叠放到C塔上。同样,这一步实际上也是由一系列更小的符合规则的移动盘子的操作组成的。用han(int n-1,char two,char one,char three)调用递归方法,注意:这里是借助于A塔,将(N-1)个盘子从B塔移动到C塔,B是源塔,C是目标塔。
这个算法达到了预期的目标,即在C塔上按正确的次序叠放了所有的圆形盘子。有了前面问题算法分析的基础,继而,就可以用C语言来实现算法。
3 算法实现
依据上述分析可知,汉诺塔问题符合实现递归的条件,而C语言又可解决递归问题,据此,用C语言来实现对汉诺塔问题的求解,用han函数来实现原问题转化为新问题的操作(问题分析的一、三步),用move函数实现递归边界的操作(问题分析的第二步),用main主函数提出问题,确定需移动盘子的数目,现编写程序如下:
4 结束语
其实,递归算法的执行过程分为递推和回归两个阶段。在递推阶段,把较为复杂的问题(如规模为N)的求解推到比原问题简单一些的问题(规模小于N)的求解。例如上面分析过程中,为求解han(int n,char one,char two,char three),推到计算han(int n-1,char two,char one,char three)。
在回归阶段,当获得最简单情况的解后,逐级返回,依次获得稍复杂问题的解。在这里的“汉诺塔”问题中,有特别的地方,回归的过程当中,还要涉及到递推。另外,在编写递归方法时要注意的是:每次调用递归方法,方法中的参数只是局限于当前调用层的,当递推进入“简单问题”层时,原来层次上的参数便被隐藏起来。在一系列“简单问题”层,都各有自己的参数。
最后,通过经典“汉诺塔”问题移动过程的分析、解决以及最后C语言编程的实现,从而掌握了解决此类问题的方法,对递归算法也有了更加深刻的理解。
参考文献
[1]王春森.程序员教程.北京:清华大学出版社,2001-05.
汉诺塔c语言 篇3
一、教师不去涉及“汉诺塔”的原因
1.实物操作慢, 耗时过多
“汉诺塔”是有实物玩具的, 教师可以利用实物来让学生操作, 但如果从最初步的探索到后续的规律发现都是实物进行操作, 学生的操作步骤会越来越多。由此带来的课堂操作时间也会增加很多, 而且“汉诺塔”的每一步都是对学生的挑战, 特别是后续的步骤更是步步维艰, 如果错了, 返工重来的次数和时间都会让学生失去兴趣。
2.移动步骤多, 记录繁琐
“汉诺塔”的初步步骤并不是很多, 学生可以非常轻松地来完成, 不需要记录相关的移动步骤。但如果想要为后续的规律发现积累相关的步骤、步数和移动策略等信息时就需要学生记录下每次移动的过程, 虽可以用简单的方式记录, 但繁琐的过程会让学生对“汉诺塔”的知识大大降低兴趣, 同时也让课堂的有效时间的利用率大打折扣。
3.规律验证难, 数据庞大
这节课是一节规律探索的课, 随着课堂的推进, 需要学生对之前发现的规律进行归纳。但由于学生之间在探索过程中所需要处理的数据相对庞大, 使得学生在发现规律的时候即使得出了相关的结论, 但无法进行进一步的验证。如, 想验证20个盘子的移动次数, 学生中很难有人能独立进行相关的操作, 且准确无错误。
正是基于上述的一些原因, 所以“汉诺塔”的这块知识在现实的小学数学教学一线中才出现基本不会去教学的情况。这也是教师针对实际的硬件和软件方面的困难而作出的无奈抉择。
那是不是不可能实现呢?其实, 并不然!
现在完全可以基于“汉诺塔”的数学小软件来实现。
二、基于“汉诺塔”的教学小软件主要存在的一些特点
1.有形有动, 每步记录
从软件的界面上可以看出, 它能很形象地让学生看到每个盘子是如何进行移动的, 学生在操作时也能非常形象化地进行操作, 在这形象化的操作过程中, 学生能够初步感受“汉诺塔”移动时的规律。并且, 软件会帮助学生记录它的移动过程, 为学生后探索移动策略奠定基础。
2.边移边学, 自我突破
这款软件不仅能让学生自主地对各种数量的盘子进行移动来发现规律, 还能在学生无法完成的时候给予学生提示和帮助。让学生看一看移动盘子的过程, 让学生感受的不是移动次数这个结果, 而是如何移动才能完成的过程。
3.可快可慢, 自主观察
软件设置了一个“速度”档位, 学生可以根据自己的能力调整相关的速度, 在后续的移动数据搜集和观察时, 可以调到适合自己观察、记录的速度, 对各个层次的学生自主学习和观察很有帮助。
基于这款软件这样的特点, 这节课可以尝试让学生自主进行“汉诺塔”规律的发现和探索。
我设计了下面的学生自主探究单:
(1) 操作并填表。
(2) 观察表格中的数据, 圆盘个数与最少步数之间有什么规律?请试着写下来。
(3) 请验证你的规律是否正确:
根据我的规律, _____ 个盘子最少要_____步;用演示功能验证后需要_____。
提示:如果与验证结果不对, 请重新观察表中数据, 修改你发现的规律。
在这个学生探究单的基础上, 如何来让学生逐步在数学小软件的帮助下感受汉诺塔中的规律呢?
板块一:传说激趣, 引发思考
出示“汉诺塔”的模型图片。是什么?知道怎么玩吗?介绍“汉诺塔”的游戏规则。
介绍“汉诺塔”的传说:在印度北部圣庙的石台上有三根针。其中一根针上从上往下穿好了由小到大的64片圆盘, 这就是“汉诺塔”。不论白天黑夜, 总有一个僧侣按照下面的规则移动圆盘:一次只移动一片, 不管在哪根针上, 小片必须在大片上面。
僧侣们预言, 当所有圆盘从原来的针移到最右边的一根针上时, 世界就会在一声霹雳中毁灭, 一众生都将同归于尽。
提问:你觉得这个传说是真的吗?为什么?
板块二:以小解大, 从1开始
提出问题:把64片圆盘都移到最右边需要多少时间呢?
我们能不能一下得到移动64片所需要的时间呢?那怎么办?同桌相互说一说。
学生交流后明确:从简单的情况移动, 来寻找其中的规律。
先找移动1个、2个、3个的时间, 再求64片圆盘的时间。
板块三:循序渐进, 不断成长
1.一尝试:拿1个盘子的时候要几步?学生操作后记录下来。
为了方便研究, 我们移动一步就算1秒钟。
2.二初步:拿2个盘子呢?怎么移?大家试一试。
3.三合作:我们已经顺利完成到移动2个盘子了, 那接下来怎么研究?
出示活动要求:
(1) 从3个盘子开始操作, 同桌比一比谁移动的步数少, 可以相互交流自己移动的策略。
(2) 独立完成探究学习单上的相关问题。
4.四归纳:3个、4个盘子最少需要几步?部分学生演示。
你发现的规律是什么?是怎么发现的?
根据你发现的规律, 要移动完传说中的64个金盘子, 需要的步数是多少?
如果移动1步要1秒, 那么共需要多少年?
正是借助数学小软件的帮助使得“汉诺塔”这节课能够让学生利用课上的时间好好体会其中的奥秘, 为学生的数学打开了新的视野。
摘要:“汉诺塔”是小学数学中的课外数学补充内容, 教师一般只是作为介绍不会让学生深入进行学习, 因为没有方式呈现复杂的移动过程, 不能让学生在形象感受的基础上进行数学的理性归纳。所阐述的就是在《汉诺塔》的数学小软件基础上, 让学生经历移动规律的发现过程, 使学生在形象化的操作平台和详细的记录方式的基础上, 感悟“汉诺塔”移动的规律, 为学生的数学学习打开了全新的视野。
关键词:“汉诺塔”,数学小软件,探索
参考文献
【汉诺塔c语言】推荐阅读:
汉诺塔06-03
普列汉诺夫05-31
汉诺威展会报告06-30
马云德国汉诺威演讲英文版06-10
c语言属于语言09-21
c语言07-21
汇编语言与C语言比较07-22
学习单片机c语言还是语言06-01
C语言实践05-19
C语言算法07-02