汉诺塔

汉诺塔
汉诺塔

课题名称:梵天的汉诺启示

——《汉诺塔》益智器具教学设计

执教教师:江西省新余市长青小学黄小蓉

评析人:江西省新余市长青小学邓小宝

教材版本:经典益智器具校本教材《思维潜能开发课程》及《义务教育课程标准实验教科书·数学》(人教版)

教学内容:本课选择学校校本教材——《思维潜能开发课程》的第2课及(人教版)五年级上册数学广角

益智器具:汉诺塔

单人游戏,著名的递归问题,游戏目的是把一

根柱子上的N个环依次移到另一根柱子上,游戏规

则要求每次只能移一个环,移动过程中大环不能压

小环。游戏策略是……逆推思维。

趣味等级:★★★★★

难度等级:★★★★★

教学设计:

一、教学设计思路

玩是孩子们的天性,在玩中增长智慧,开发智能,玩出名堂,这是我们致力追求的目标。这节课就是想让学生了解汉诺塔的游戏目的规则,再根据目的规则去探究游戏策略,掌握游戏思路,化难为易,从而渗透一些“递归”的数学思想和方法,同时了解一些汉诺塔的历史传说、算法、类似故事等相关知识,拓展学生的知识面。使学生在主动地动手、动口、动脑、自主、合作、探究中学会观察,激活顿悟,培养其严密性等思维品质及推理判断等逻辑思维能力,积淀智慧,培养探究学习兴趣和创新能力,努力凸显“乐学高效”的优质课堂愿景。

中国教育科学研究院李嘉骏教授在《开发思维潜能,培养聪明学生》的报告中谈到:在课程改革实施过程中,为顺应现代教育变革的观念和关系,提升教学技艺、探究教学游戏、践行优质课堂,提高教学质量,使学生更聪明,培养新时代需要的合格人才,而努力!我们研究的方向要坚守!目标:追求好的教育,培养聪明的学生!要将劲儿往实处做…让学生变个样!教师变个样!学校变个样!培育自己的特色、树起好标杆![1]

(一)教材分析

1、教材地位作用和内容:

编排作用:用学生易于理解的生活实例或经典的数学问题渗透数学思想方法,让学生感受数学与生活的联系。[2]

2、知识的前后联系:

3、相关旧知识分析

知识的连接点:到五年级,学生已经有了一些逆推思维,比如说减法是加法的逆运算,除法是乘法的逆运算,解决问题时从问题出发一步一步去寻找必要的条件等等,以及学习了运用一些优化思想、对策问题、排列组合法、排除法、不完全归纳法、以小见多法、化难为易法等等数学思想和方法来解决新的数学问题。

知识的生长点:使学生运用逆推法和类推法推导出解决汉诺塔问题的关键就是要知道第一个圆环放到哪个柱子上,并且使学生理解辅助柱和起始柱地相对关系。为五年级继续学习数学广角知识里的编码问题和找次品问题做好思维上的准备。

(二)学情分析

孩子们小时候大多数都玩过叠象牙塔的玩具,就是把一些圆环按从大到小的顺序依次叠在一根柱子上,但是像汉诺塔这样在底座上有三根柱子,要把一些圆环按从大到小的顺序依次从一根柱子移到另一根柱子上,在移动过程中一次只能移一个且不能以大压小的益智玩具,学生就没有玩过。

(三)教学资源分析

多媒体教学课件、实物投影仪、汉诺塔益智器具。

(四)主要教学方式、方法

1.演示法:巧用课件演示功能,将汉诺塔的历史故事、基本玩法、相关知识等一一演示呈现,更具逼真的演示效果。

2.实验法:学生实际运用汉诺塔器具进行操作和探究。

二、教学目标

1、使学生运用倒推法,推导出“汉诺塔”的游戏策略,掌握其游戏思路。

2、使学生了解些汉诺塔的相关知识。

3、培养学生学习数学的兴趣,培养其思维的逻辑性,提高其思维的敏捷性。

三、教学要点

1、重点:汉诺塔的游戏策略和思路。

2、难点:单数圆环个数和双数圆环个数时,第一个往哪移。

3、关键:在每次的移环过程中理解“辅助柱”和“起始柱”的相对关系。

教具:汉诺塔,课件;学具:人手一个汉诺塔。

思路和策略是:

(1)按顺时针方向把圆盘

师:这节课上到这,你有什么收获和感想吗?(让学生畅所欲言)

七、教学反思或创新特色:

在中国教育科学研究院教学科技研发中心“优质课堂与现代教学技艺运用的研究”总课题组举办的“思维潜能开发”实验项目研修培训上,于浩老师谈到“数学思维教育的本质是训练人从数学角度对事物规律的认知能力,主要通过数学思维训练来实现”。三类数学思维训练器具:顿悟系列(如:双马双骑士、捆仙绳、金字塔等)、空间几何系列(如:七巧板、神龙摆尾、巧放圆形等)、数理逻辑系列(如:九宫图、争王棋、数独等)。[3]

这节课充分体现了于浩老师的讲稿精神,调动了学生学习的积极性,培养了学生兴趣,发展了学生智能,拓宽了学生的知识面。

第一:用汉诺塔的印度古老传说导入新课、引出课题,引人入胜,吸引了学生的注意力,激发了学生的兴趣,调动了学生的求知欲。

第二:先让学生尝试着玩,发现玩汉诺塔并不容易,使探究其玩法的策略和思路成了学生迫切的内在需要,有需要就会有动力,变“要我研究”为“我要研究”,充分调动了学生学习的积极性和主动性。

第三:让学生从易到难,从具体到抽象,先操作3个环、4个环,后脱离实物,独立推理5个环、6个环……,促使学生从具体形象思维到抽象逻辑思维的提升,发展了学生的智能。

第四:玩汉诺塔是个非常复杂的递归问题,但老师善于引导学生抓住关键点:只要知道每一步第1个环放在哪根柱子上,然后依次循环下去即可。这种化繁为简、变难为易的数学研究方法,无形当中对学生今后的学习研究有这潜移默化的作用。

第五:这节课不仅局限于玩法本身,而且还致力于丰富和拓展学生的知识面,用课件让学生了解些汉诺塔的一些算法和相关知识,使学生觉得数学世界是这么的奇妙有趣,从而更加热爱数学,热爱数学研究。

八、教学后记:

这节课重点解决理解思路和策略的问题,学生大多数理解了,就基本达到了教学目标。熟练、快速是后面练习课的事,在这节课中不要强求。

九、评析

杨建华教授指出:在学生先天自然禀赋的基础上,后天的“挖掘”、“培育”不仅可能,而且同样重要。我们通过益智游戏进行思维教育的主旨就是:促进以思维为核心的认知水平的提高、促进思维的发展、强化和提升。【4】黄老师不仅让学生知其然,而且让学生知其所以然,不仅让学生知道怎么玩汉诺塔,而且让学生知道为什么这么玩汉诺塔,注重的是策略,而不只是方法,站在启发学生思维的高度进行游戏的教学,很好的诠释了杨建华教授主讲的重要思想,不是为游戏而游戏,而是在游戏中启迪学生的智能,发展学生的各项思维。

这节课不但充分体现了学生为主体的地位,而且也充分体现了教师主导的作用,该牵的时候牵,该导的时候导,该教的时候教,该放手的时候又充分地放手。比如基本技法和特别技法,黄老师就采用了示范教的方法,而接下来的解环装环的策略,黄老师就充分放手,让学生先操作探索,老师只是引导。这节课符合新课程标准,让学生在玩中学,在玩中思,在玩中成长,使学生把“学海无涯苦作舟”变为“学海无涯乐作舟”,把“要我学”变为“我要学”,学习兴趣高昂,充分体现了学习以人为本、人人学不同的数学的新理念。

同时这节课黄老师极力拓宽学生的知识面,从汉诺塔的古老传说,到现代数学教破解汉诺塔的算法,再到与汉诺塔相类似的“棋盘装麦粒”问题,变化的汉诺塔策略和算法,等等,让学生有个大致的全面的了解,培养了学生对数学的热爱和学好数学的信心。

数学来源于生活,又高于生活,还指导生活,让学生回到生活中去,了解汉诺塔在生活中的应用,体现了生活中处处有数学的理念。

十、参考文献

1. 李嘉骏.《发思维潜能,培养聪明学生》中国教育科学研究院

2.《义务教育课程标准实验教科书数学五年级上册》培训提纲人民教育出版社小学数学室

3.于浩. 《数学思维训练体验》中国教育科学研究院

4.杨建华.《关于思维潜能开发的若干理论与实践问题》中国教育科学研究院

汉诺塔问题的三种实现

// test_project.cpp : 定义控制台应用程序的入口点。//汉诺塔问题的 // //递归实现 /*#include "stdafx.h" #include using namespace std; int count=0;//记录移动到了多少步 void Move(int n,char From,char To); void Hannoi(int n,char From, char Pass ,char To); //把圆盘从From,经过pass,移动到To int main() { int n_count=0; cout<<"请输入圆盘个数:"; cin>>n_count; Hannoi(n_count,'A','B','C'); } void Move(int n,char From,char To)

{ count++; cout<<"第"<

/*后来一位美国学者发现一种出人意料的简单方法,只要轮流进行两步操作就可以了。首先把三根柱子按顺序排成品字型,把所有的圆盘按从大到小的顺序放在柱子A上,根据圆盘的数量确定柱子的排放顺序:若n为偶数,按顺时针方向依次摆放A B C; 若n为奇数,按顺时针方向依次摆放A C B。 ()按顺时针方向把圆盘从现在的柱子移动到下一根柱子,即当n为偶数时,若圆盘在柱子A,则把它移动到B;若圆盘在柱子B,则把它移动到C;若圆盘在柱子C,则把它移动到A。 ()接着,把另外两根柱子上可以移动的圆盘移动到新的柱子上。即把非空柱子上的圆盘移动到空柱子上,当两根柱子都非空时,移动较小的圆盘。这一步没有明确规定移动哪个圆盘,你可能以为会有多种可能性,其实不然,可实施的行动是唯一的。 ()反复进行()()操作,最后就能按规定完成汉诺塔的移动。 所以结果非常简单,就是按照移动规则向一个方向移动金片: 如阶汉诺塔的移动:A→C,A→B,C→B,A→C,B→A,B→C,A→C 汉诺塔问题也是程序设计中的经典递归问题,下面我们将给出递归和非递归的不同实现源代码。*/ /*#include "stdafx.h" #include #include

汉诺塔栈c语言

计算机科学与工程学院 《算法与数据结构》试验报告[二] 专业班级10级计算机工程02 试验地点计算机大楼计工教研室学生学号1005080222 指导教师蔡琼 学生姓名肖宇博试验时间2012-4-14 试验项目算法与数据结构 试验类别基础性()设计性()综合性(√)其它() 试验目的及要求(1)掌握栈的特点及其存储方法;(2)掌握栈的常见算法以及程序实现;(3)了解递归的工作过程。 成 绩评定表 类别评分标准分值得分合计 上机表现积极出勤、遵守纪律 主动完成设计任务 30分 程序与报告程序代码规范、功能正确 报告详实完整、体现收获 70分 备注: 评阅教师: 日期:年月日

试 验 内 容 一、实验目的和要求 1、实验目的: (1)掌握栈的特点及其存储方法; (2)掌握栈的常见算法以及程序实现; (3)了解递归的工作过程。 2、实验内容 Hanoi 塔问题。(要求4个盘子移动,输出中间结果) 3、实验要求: 要求实现4个盘子的移动,用递归和栈实现。 二、设计分析 三个盘子Hanoi 求解示意图如下: 三个盘子汉诺塔算法的运行轨迹: B A B C A B C A C A B C (a (b) (c (d) ⑸ ⑼ ⑶ Hanio(3,A,B,C) Hanio(3,A,B,C) Hanio(2,A,C,B) Hanio(2,A,C,B) Hanio(1,A,B,C) Hanio(1,A,B,C) Move (A,C) Move (A,B) Hanio(1,C,A,B) Hanio(1,C,A,B) Move (C,B) Move (A,B) Hanio(2,B,A,C) Hanio(2,B,A,C) Hanio(1,B,C,A) Hanio(1,B,C,A) Move (B,C) Hanio(1,A,B,C) Hanio(1,A,B,C) Move (A,C) Move (B,A) 递归第一层 递归第二层 递归第三层 ⑴ ⑵ ⑷ ⑹ ⑺ ⑻ ⑽ ⑾ ⑿ ⒀ ⒁

智慧汉诺塔活动方案

神奇汉诺塔游戏活动方案 汉诺塔问题在教学届有很高的研究价值,至今还在被一些数学家们研究,也是我们所喜欢的一种益智游戏。它可以帮助开发智力,激发我们的思维,让小学生接触这款益智游戏,利用一次次不断的探索和尝试,可以激发他们的兴趣,积极应对困难,获得成功体验,锻炼他们的思维,同时也培养学生主动探究,不服输的精神。把组成“金塔”的圆片按照下大上小依次放在中央的柱子上,每次只能移动一个圆片,在移动的过程中,大圆不能压在小圆上面,每次移动的圆片只能放在左中右的位子,将整座“金塔”移到另外一根柱子上即告胜利。 和汉诺塔故事相似的,还有另外一个印度传说:舍罕王打算奖赏国际象棋的发明人──宰相西萨?班?达依尔。国王问他想要什么,他对国王说:“陛下,请您在这张棋盘的第1个小格里赏给我一粒麦子,在第2个小格里给2粒,第3个小格给4粒,以后每一小格都比前一小格加一倍。请您把这样摆满棋盘上所有64格的麦粒,都赏给您的仆人吧!”国王觉得这个要求太容易满足了,就命令给他这些麦粒。当人们把一袋一袋的麦子搬来开始计数时,国王才发现:就是把全印度甚至全世界的麦粒全拿来,也满足不了那位宰相的要求。 那么,宰相要求得到的麦粒到底有多少呢?总数为 1+2+2^2 + … +2^63=2^64-1 等于移完汉诺塔的步骤数——共3853步。我们已经知道这个数字有多么大了。人们估计,全世界两千年也难以生产这么多麦子! 其实算法非常简单,当盘子的个数为n时,移动的次数应等于2^n – 1 活动目的: 1、让学生在活动过程中,根据解决问题的需要,经过自己的探索,体验化繁为简找规律这一解决数学问题的基本策略。 2、经历收集有用的信息、进行归纳、类比与猜测、再验证猜测,这一系列数学思维过程,发展学生的归纳推理能力。 3、能用有条理的、清晰的语言阐述自己的想法。 4、在活动中,学习与他人合作,懂得谦让,能互相帮助。 5、在老师、家长的鼓励与引导下,能积极地应对活动中遇到的困难,在活动中获得成功体验。 活动时间:2014年12月 活动口号:放松心情,你行我也行! 活动地点:怀德教育集团六(3)、六(5)班。 活动开展安排:

汉诺塔课程设计

汉诺塔课程设计 一、教学内容: 1、了解汉诺塔的历史。 2、讲解汉诺塔的游戏规则。 二、课程设计目的: 1、让伙伴们了解汉诺塔的历史,勾起孩子们的学习兴趣,让伙伴们更加热爱数学。 2、在掌握汉诺塔玩法的基础上,锻炼伙伴们的观察力,变通里,和右脑开发。 3、增强伙伴们的空间想象能力和动手能力。 4、让伙伴们体会到数学的神奇,从而对数学产生更加浓厚的兴趣。 三、培养技能:观察力、想象力、变通里、右脑开发。 四、所需工具:汉诺塔、记号笔。 五、教学流程概述: 第一节课:1、讲一个关于汉诺塔的故事。2、带领伙伴们一起观察和了解汉诺塔的游戏规则。(以三盘为例说明)(30分钟) 第二节课:汉诺塔4盘的移法。(30分钟) 第三节课:汉诺塔5盘的移法。(30分钟) 第四节课: 汉诺塔月底考核。(30分钟) 六、教学流程详细解读: 第一节课:让伙伴们了解汉诺塔的历史,勾起孩子们的学习 兴趣,让伙伴们更加热爱数学。 1、讲关于汉诺塔的故事: 在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄 铜板上插着三根宝石针。印度教的主神梵天在创造世界的时 候,在其中一根针上从下到上地穿好了由大到小的64片金 片,这就是所谓的汉诺塔。不论白天黑夜,总有一个僧侣在 按照下面的法则移动这些金片:一次只移动一片,不管在哪 根针上,小片必须在大片上面。僧侣们预言,当所有的金片都从梵天穿好的那根针上移

、告诉伙伴们游戏规则: 以三个环为例说明: (一)先让伙伴们自己观察有几个柱子,有几个盘,并且盘是怎么排列的? 答:有三根相邻的柱子,第一根柱子上从下到上放着3个不同大小的圆盘,并且顺序是由大到小依次叠放。 (二)分别为这3个相邻的柱子编号A柱、B柱、C柱;在为这3个圆盘编号盘1、盘2、盘3。 让伙伴们自己动脑想想:如何要把A柱上的3个盘子一个一个移动到C柱上,并且每次移动同一根柱子上都必须保持大点的盘子在下,小点的盘子在上。最后也要使移动到C 柱的圆盘从下到上按照盘3,2,1金字塔的形状排列。 (三)带领伙伴们一起动手操作: (1)、盘1移动到C柱。 (2)、盘2移动到B柱。 (3)、盘1在移动到B柱上,这时盘1在盘2上。 (4)、盘3移动到C柱上。 (5)、再将盘1移动到A柱,这时B柱就只剩盘2。 (6)、将盘2移动到C柱,在盘3上边。 (7)、再将盘1移动到C柱,这时就成功了。 (四)鼓励伙伴们再来一次,按照刚才的移动方法 将C柱的圆盘移动到A柱。 (五)等所有伙伴都移动成功都移动成功后,引导伙伴们仔细思考,看看各位伙伴在移动的过程中有发现什么规律和技巧没有? 带领伙伴再来熟悉一遍: 第一步:盘1移动到C柱;第二步:盘2移动到B柱;......第四步:盘3移动到C柱上......

汉诺塔问题

实验二知识表示方法 梵塔问题实验 1.实验目的 (1)了解知识表示相关技术; (2)掌握问题规约法或者状态空间法的分析方法。 2.实验内容(2个实验内容可以选择1个实现) (1)梵塔问题实验。熟悉和掌握问题规约法的原理、实质和规约过程;理解规约图的表示方法; (2)状态空间法实验。从前有一条河,河的左岸有m个传教士、m个野人和一艘最多可乘n人的小船。约定左岸,右岸和船上或者没有传教士,或者野人数量少于传教士,否则野人会把传教士吃掉。搜索一条可使所有的野人和传教士安全渡到右岸的方案。 3.实验报告要求 (1)简述实验原理及方法,并请给出程序设计流程图。 我们可以这样分析: (1)第一个和尚命令第二个和尚将63个盘子从A座移动到B座; (2)自己将底下最大的盘子从A移动到C; (3)再命令第二个和尚将63个盘子从B座移动到C;(4)第二个和尚命令第三个和尚重复(1)(2)(3);以此类推便可以实现。这明显是个递归的算法科技解决的问

题。 (2)源程序清单: #include #include using namespace std; void main() { void hanoi(int n,char x,char y,char z);

int n; printf("input the number of diskes\n"); scanf("%d",&n); hanoi(n,'A','B','C'); } void hanoi(int n,char p1,char p2,char p3) { if(1==n) cout<<"盘子从"<

c语言课程设计--汉诺塔

课程设计报告 课程设计名称:C语言课程设计 课程设计题目:汉诺塔问题求解演示 院(系):计算机学院 专业:计算机科学与技术 班级: 学号: 姓名: 指导教师: 完成时间:2010年3月18日

沈阳航空航天大学课程设计报告 目录 第1章需求分析 (3) 1.1 课程设计的题目及要求 (3) 1.2 总体分析 (3) 第2章系统设计 (4) 2.1 主要函数和函数功能描述 (4) 2.2 功能模块图 (4) 第3章详细设计 (5) 3.1主函数流程图 (5) 3.2各功能模块具体流程图 (6) 第4章调试分析 (10) 4.1.调试初期 (10) 4.2.调试中期 (10) 4.3.调试后期 (10) 参考文献 (11) 附录 (12)

第1章需求分析 1.1 课程设计的题目及要求 题目:汉诺塔问题求解演示 内容: 在屏幕上绘出三根针,其中一根针上放着N个从大到小的盘子。要求将这些盘子从这根针经过一个过渡的针移到另外一根针上,移动的过程中大盘子不能压在小盘子上面,且一次只能移动一个盘子。要求形象直观地演示盘子移动的方案和过程。 要求: 1)独立完成系统的设计,编码和调试。 2)系统利用C语言实现。 3)安照课程设计规范书写课程设计报告。 4)熟练掌握基本的调试方法,并将程序调试通过 1.2总体分析 本题目需要使用C语言绘制图形,所以需要turbo C,需要绘图函数,而汉诺塔的函数属于经典的函数,在书本上都学习过,所以这个题目的难点在于需要绘制汉诺塔图形。攻克这一点其他的问题都迎刃而解。但是我个人以前也没有学过一些关于turboC 方面的知识。所以我将重点放在了对#include下的一系列绘图函数的研究与应用,对屏幕上的图像坐标分析是一个难点。其中用到了graphics.h头文件中的bar, outtextxy, setfillstyle,closegraph函数。进行了画图(利用bar函数进行画框的操作),填充颜色(利用setfillstyle函数填充白色和黑色,以分辨图形与图形背景),在特定位置输出特定字符等操作(利用outtextxy函数)。

汉诺塔程序实验报告

实验题目: Hanoi 塔问题 一、问题描述: 假设有三个分别命名为 A , B 和C 的塔座,在塔座 B 上插有n 个直径大小各不相同、从小到 大编号为1, 2,…,n 的圆盘。现要求将塔座 B 上的n 个圆盘移至塔座 A 上并仍按同样顺序 叠排,圆盘移动时必须遵守以下规则: (1 )每次只能移动一个圆盘; (2)圆盘可以插在 A , B 和C 中任一塔上; ( 3)任何时刻都不能将一个较大的圆盘压在较小的圆盘之上。 要求: 用程序模拟上述问题解决办法,并输出移动的总次数, 圆盘的个数从键盘输入; 并想 办法计算出程序运行的时间。 二、 算法思路: 1 、建立数学模型: 这个问题可用递归法解决,并用数学归纳法又个别得出普遍解法: 假设塔座B 上有3个圆盘移动到塔座 A 上: (1) "将塔座B 上2个圆盘借助塔座 A 移动到塔座C 上; (2) "将塔座B 上1个圆盘移动到塔座 A 上; (3) "将塔座C 上2个圆盘借助塔座 B 移动到塔座A 上。 其中第 2步可以直接实现。第 1步又可用递归方法分解为: 1.1"将塔座B 上1个圆盘从塔座 1.2"将塔座B 上1个圆盘从塔座 1.3"将塔座A 上1个圆盘从塔座 第 3 步可以分解为: 3.1将塔座C 上1个圆盘从塔座 3.2将塔座C 上1个圆盘从塔座 3.3将塔座B 上1个圆盘从塔座 综上所述:可得到移动 3 个圆盘的步骤为 B->A,B->C, A->C, B->A, C->B, C->A, B->A, 2、算法设计: 将n 个圆盘由B 依次移到A , C 作为辅助塔座。当 n=1时,可以直接完成。否则,将塔 座B 顶上的n-1个圆盘借助塔座 A 移动到塔座C 上;然后将圆盘B 上第n 个圆盘移到塔 座A 上;最后将塔座 C 上的n-1个圆盘移到塔座 A 上,并用塔座B 作为辅助塔座。 三、原程序 #include #include #include int times = 0; void move(char a, char b) { printf("%c > %c \n", a,b); } void hno(int n,char a , char b, char c) { if (n==1) { move(a,c); times ++; } X 移动到塔座 A ; X 移动到塔座 C ; Z 移动到塔座 C 。 Y 移动到塔座 Y 移动到塔座 X 移动到塔座 B ; A ;

从汉诺塔问题看递推关系在实际问题中的应用

从汉诺塔问题看递推关系在实际问题中的应用 姓名:孙瑞 学号:200640501218 指导老师:马玉田 摘要:本文主要介绍了递推关系在实际中的应用,对几个实际问题的分析,让我们清楚的看到递推关系在 解决实际问的强大作用. 关键词:数列 递推关系 汉诺塔 九连环 蛛网模型 引言: 递推关系在实际问题中有着广泛的应用.由连续变量可以建立微分方程模型,离 散变量可以建立递推关系模型. 经过分析可知,常、偏微分方程除非在极其特殊的情况下,否则一般不存在解析解,所以讨论起来非常麻烦,比如最基本的平衡点的稳定性,往往只能得到局部稳定性,全局稳定性很难得到,而递推关系模型可以达到全局的效果,另外,由递推关系获得的结果又可以进一步进行优化分析、满意度分析、分类分析、相关分析等等。而在实际中,连续变量可以用离散变量来近似和逼近,从而微分方程模型就可以近似于某个递推关系模型。递推关系模型有着非常广泛的实际应用背景,我们的前人建立了许多著名的模型,如生态模型,传染病模型,经济模型(如蛛网模型),人口控制模型(如著名的马尔萨斯人口控制模型)等等. 定义:设012,,,,n a a a a 是一个数列,把该数列中n a 与它的前面几个 (01)i a i n ≤≤-关联起来构成的方程,称为一个递推关系,即(,,)n j k a f a a = (0,1)j k n ≤≤-. 下面让我们看看递推关系在汉诺塔问题中的应用. 引例:汉诺塔(又称河内塔)问题是印度的一个古老的传说。开天辟地的神勃拉玛在一个庙里留下了三根金刚石的棒,第一根上面套着64个圆的金片,最大的一个在底下,其余一个比一个小,依次叠上去,庙里的众僧不倦地把它们一个个地从这根棒搬到另一根棒上,规定可利用中间的一根棒作为帮助,但每次只能搬一个,而且大的不能放在小的上面。面对庞大的数字(移动圆片的次数)18446744073709551615,看来,众僧们耗尽毕生精力也不可能完成金片的移动 汉诺塔问题:它是由三根固定的柱子ABC 和不同尺寸的n 个圆盘组成.开始时,这些个大小不同的圆盘依其半径大小依次套在A 柱上,使大圆盘在底下.游戏的规则是:每次的圆盘从一根柱子移到另一根柱子上,但是不允许这个圆盘放在比它小的圆盘上面.游戏的目标是

汉诺塔问题实验报告

1.实验目的: 通过本实验,掌握复杂性问题的分析方法,了解汉诺塔游戏的时间复杂性和空间复杂性。 2.问题描述: 汉诺塔问题来自一个古老的传说:在世界刚被创建的时候有一座钻石宝塔(塔A),其上有64个金碟。所有碟子按从大到小的次序从塔底堆放至塔顶。紧挨着这座塔有另外两个钻石宝塔(塔B和塔C)。从世界创始之日起,婆罗门的牧师们就一直在试图把塔A 上的碟子移动到塔C上去,其间借助于塔B的帮助。每次只能移动一个碟子,任何时候都不能把一个碟子放在比它小的碟子上面。当牧师们完成任务时,世界末日也就到了。 3.算法设计思想: 对于汉诺塔问题的求解,可以通过以下三个步骤实现: (1)将塔A上的n-1个碟子借助塔C先移到塔B上。 (2)把塔A上剩下的一个碟子移到塔C上。 (3)将n-1个碟子从塔B借助于塔A移到塔C上。 4.实验步骤: 1.用c++ 或c语言设计实现汉诺塔游戏; 2.让盘子数从2 开始到7进行实验,记录程序运行时间和递 归调用次数; 3.画出盘子数n和运行时间t 、递归调用次数m的关系图, 并进行分析。 5.代码设计: Hanio.cpp #include"stdafx.h" #include #include #include void hanoi(int n,char x,char y,char z) { if(n==1) { printf("从%c->搬到%c\n",x,z); } else { hanoi(n-1,x,z,y); printf("从%c->%c搬到\n",x,z); hanoi(n-1,y,x,z); }

汉诺塔非递归算法C语言实现

汉诺塔非递归算法C语言实现 #include #include #define CSZL 10 #define FPZL 10 typedef struct hanoi { int n; char x,y,z; }hanoi; typedef struct Stack { hanoi *base,*top; int stacksize; }Stack; int InitStack(Stack *S) { S->base=(hanoi *)malloc(CSZL*sizeof(hanoi)); if(!S->base) return 0; S->top=S->base; S->stacksize=CSZL; return 1; } int PushStack(Stack *S,int n,char x,char y,char z) { if(S->top-S->base==S->stacksize) { S->base=(hanoi *)realloc(S->base,(S->stacksize+FPZL)*sizeof(hanoi)); if(!S->base) return 0; S->top=S->base+S->stacksize; S->stacksize+=FPZL; } S->top->n=n; S->top->x=x; S->top->y=y; S->top->z=z; S->top++; return 1; } int PopStack(Stack *S,int *n,char *x,char *y,char *z) { if(S->top==S->base)

汉诺塔问题的重点是分析移动的规则

汉诺塔问题的重点是分析移动的规则,找到规律和边界条件。 若需要将n个盘子从A移动到C就需要(1)将n-1个盘子从A移动到B;(2)将你第n个从A移动到C;(3)将n-1个盘子再从B 移动到C,这样就可以完成了。如果n!=1,则需要递归调用函数,将A上的其他盘子按照以上的三步继续移动,直到达到边界条件n=1为止。 思路清楚了,程序就好理解了。程序中的关键是分析好每次调用移动函数时具体的参数和对应的A、B、C塔的对应的关系。下面来以实际的例子对照程序进行说明。 ①move(int n,int x,int y,int z) ②{ ③if (n==1) ④printf("%c-->%c\n",x,z); ⑤else ⑥{ ⑦move(n-1,x,z,y); ⑧printf("%c-->%c\n",x,z); ⑨{getchar();}//此句有必要用吗?感觉可以去掉的吧 ⑩move(n-1,y,x,z); } }

比如有4个盘子,现在全部放在A塔上。盘子根据编号为1、2、3、4依次半径曾大。现在要将4个盘子移动到C上,并且是按原顺序罗列。首先我们考虑如何才可以将4号移动到C呢?就要以B为中介,首先将上面的三个移动到B。此步的操作也就是程序中的①开始调入move函数(首次调用记为一),当然现在的n=4,然后判断即③n!=1所以不执行④而是到⑤再次调用move函数(记为二)考虑如何将3个盘移动到B的方法。此处是递归的调用所以又一次回到①开始调入move函数,不过对应的参数发生了变化,因为这次要考虑的不是从A移动4个盘到C,而是要考虑从A如何移动移动3个盘到B。因为n=3,故不可以直接移动要借助C做中介,先考虑将两个移动到C的方法,故再一次到⑤再一次递归调用move函数(记为三)。同理两个盘还是不可以直接从A移动到C所以要以B为中介考虑将1个移动到B的过程。这次是以B为中介,移动到C为目的的。接下来再一次递归调用move函数(记为四),就是移动到B一个,可以直接进行。程序执行③④句,程序跳出最内一次的调用(即跳出第四次的调用)返回上一次(第三次),并且从第三次的调用move 函数处继续向下进行即⑧,即将2号移动到了C,然后继续向下进行到 ⑩,再将已经移到B上的哪一个移回C,这样返回第二次递归(以C 为中介将3个盘移动到B的那次)。执行⑧,将第三个盘从A移动到B,然后进入⑩,这次的调用时因为是将C上的两个盘移到B以A

C语言程序设计 入门源代码代码集合

#include <> void print_star(void) { printf("*****************\n"); } void print_welcome(void) { printf("C language,welcome!\n"); } void main() { print_star(); print_welcome(); print_star(); getchar(); } 演示2 #include "" int sum(int i,int j) { return(i + j); } void main() { int n1,n2; printf("input 2 numbers:\n"); scanf("%d%d",&n1,&n2); printf("the sum = %d\n",sum(n1,n2)); getchar(); } 演示3 #include "" int maxnum(int,int,int); main() { int a,b,c; printf("Please enter 3 numbers:\n"); scanf("%d,%d,%d",&a,&b,&c); printf("Maxnum is %d\n",maxnum(a,b,c)); return 0;

} int maxnum(int x,int y,int z) { int max=x; if(y>max) max = y; if(z>max) max = z; return max; } 演示4 #include <> int s1(int n) { int j,s; s=0; for(j=1;j<=n;j++) s=s+j; return s; } int sum(int n) { int i,s=0; for(i=1;i<=n;i++) s=s+s1(i); return s; } void main() { int n; printf("n:"); scanf("%d",&n); printf("s=%d\n",sum(n)); } 演示5 #include <>

scratch图解汉诺塔问题

scratch图解汉诺塔问题 汉诺塔:汉诺塔(Tower of Hanoi)源于印度传说中,大梵天创造世界时造了三根金钢石柱子,其中一根柱子自底向上叠着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘 在进行转移操作时,都必须确保大盘在小盘下面,且每次只能移动一个圆盘,最终c柱上有所有的盘子且也是从上到下按从小到大的顺序。 当a柱子上只有一个盘子时只要把那个盘子直接移到c就行了, 有两个盘子的话把1号盘先移到b柱,在把2号盘移到c柱,最后把b柱上的1号盘移到c柱就行了, 那么如果有n个盘子呢? 这里我们先把上方的n-1个盘子看成整体,这下就等于只有两个盘子,自然很容易了,我们只要完成两个盘子的转移就行了,再把前n-2个盘子看作一个整

体,就这样一步步向前找到可以直接移动的盘子,n-3......,2,1,最终,最上方的盘子是可以直接移动到c柱的。 看到这里其实就已经有了程序的设计思路,那就是递归,这个时候只要理解递归最终的解决的问题是什么就行了,中间的事交给程序,递归可以很绕也可以很直接,我们按照最直接的理解就行了。

如果你想想清楚每一步执行过程,那么你可以继续往下看,确实有点乱,切记别把自己绕晕了。 举个例子:当n=7时,前6个要想办法成功移动到b柱上,7号是Boss,他不管上面的6个小弟用什么办法,我可以先等着,于是7号在等着上面6个完成移到b柱,现在6是临时老大,他也想去c柱,于是他命令前5个移到b 柱,他等着,5号也采取之前两个的做法,于是这个命令一直往前传,没办法,上面被压着自己也没法动啊。 终于到了1号,他是现在唯一能动的,于是1号移动到了b柱,好了,2号可以到c柱。不过a柱上还有3号,于是让1号移到c柱,3号可以到b柱了,之后1号和2号在想办法到b柱,于是1,2,3号在b柱,4号也要得到b柱啊,1,2,3号你们按照刚才的办法到c柱,空出b柱给4号。后面的5号、6号都重复这样的操作,终于前6号移动到b柱,7号直接跑到了c柱,于是剩下在b 柱的6个小弟还要再干一遍他们在a柱上干的事。 程序截图:

汉诺塔程序解读

hanoi塔程序如下: main() {hanoi(3,'A','B','C'); } hanoi(n,a,b,c) int n; char a,b,c; {if (n==1) printf("%c-->%c\n",a,c); else {hanoi (n-1,a,c,b); printf ("%c-->%c\n",a,c); hanoi (n-1,b,a,c);} } 运行结果: A-->C A-->B C-->B A-->C B-->A B-->C A-->C 问题: hanoi(n,a,b,c) int n; char a,b,c; {if (n==1) printf("%c-->%c\n",a,c); else {hanoi (n-1,a,c,b); printf ("%c-->%c\n",a,c); hanoi (n-1,b,a,c);} } 我给你详细解释下这个程序中的代码吧。我也是刚学,希望对你有用。可能有些不好之处,还希望谅解。 先说下这个问题的整体思想: 1,如果只有1个盘,那么就直接把这个盘从A移动到C上。

2,如果存在两个盘,那么先把第一个盘移动到B上,在把最下面一个盘移动到C上,在把B上的盘移动到C上。 3,这样,我们可以得出一个结论,如果存在N个盘,可以先把上面N-1个盘通过C 移动到B上,然后把第N个盘移动到C上,再把B上的N个盘通过A 移动到C上。 if (n==1) printf("%c-->%c\n",a,c); 这一句,表示只有1个盘子的时候,那么就是把第一个盘子直接移到第三个盘子上。 else {hanoi (n-1,a,c,b); 如果超过一个盘字,则需要先把N-1个盘子通过C 移动到B上。 printf ("%c-->%c\n",a,c); 把剩下的第N个盘,从A移动到C上。 hanoi (n-1,b,a,c);} 再把剩下的在B上的N-1个盘,通过A移动到C上。 这属于一个递归算法。 现在,N=3。 我们看下程序怎么运行的。 else {hanoi (n-1,a,c,b); printf ("%c-->%c\n",a,c); hanoi (n-1,b,a,c);} N=3,也就是开始程序会执行 hanoi (2,a,c,b);这句语句。 再看,2还是大于1,所以 程序会继续运行。注意,这里,为hanoi (2,a,c,b); C和B 换了位置。 hanoi (2,a,c,b); 我们把数字代入,得出。 根据N=2,C和B 互换。以及下面的代码,得出 ````````````````````````````````````````````````

C语言程序设计-入门源代码代码集合

演示1 #include void print_star(void) { printf("*****************\n"); } void print_welcome(void) { printf("C language,welcome!\n"); } void main() { print_star(); print_welcome(); print_star(); getchar(); } 演示2 #include "stdio.h" int sum(int i,int j) { return(i + j); } void main() { int n1,n2; printf("input 2 numbers:\n"); scanf("%d%d",&n1,&n2); printf("the sum = %d\n",sum(n1,n2)); getchar(); } 演示3 #include "stdio.h" int maxnum(int,int,int); main() { int a,b,c; printf("Please enter 3 numbers:\n"); scanf("%d,%d,%d",&a,&b,&c); printf("Maxnum is %d\n",maxnum(a,b,c));

return 0; } int maxnum(int x,int y,int z) { int max=x; if(y>max) max = y; if(z>max) max = z; return max; } 演示4 #include int s1(int n) { int j,s; s=0; for(j=1;j<=n;j++) s=s+j; return s; } int sum(int n) { int i,s=0; for(i=1;i<=n;i++) s=s+s1(i); return s; } void main() { int n; printf("n:"); scanf("%d",&n); printf("s=%d\n",sum(n)); } 演示5

汉诺塔问题

XXXX大学信息学院 课程设计报告 教师签名:xxxxx

题目1实验报告 1.数据结构定义 因为该算法需要用到循环队列、堆和线性表,因此采用以下数据类型: typedef struct { QElemType *base; // 初始化的动态分配存储空间 int front; // 头指针,若队列不空,指向队列头元素 int rear; // 尾指针,若队列不空,指向队列尾元素的下一个位置 }SqQueue;//循环队列 typedef struct { int *elem; int length; int listsize; }SqList;//堆排序 2.算法说明 void HeapAdjust(int flag,SqList &H,int s,int m) void HeapSort(int flag,SqList &H)//对H进行堆排序; Status InitQueue(SqQueue &Q)//构造一个空队列Q,该队列预定义大小为MAXQSIZE; Status EnQueue(SqQueue &Q,QElemType e) //插入元素e为Q的新的队尾元素; Status DeQueue(SqQueue &Q, QElemType &e) // 若队列不空, 则删除Q的队头元素, 用e 返回其值, 并返回OK; 否则返回ERROR; Status GetHead(SqQueue Q, QElemType &e)// 若队列不空,则用e返回队头元素,并返回OK,否则返回ERROR; Status QueueLength(SqQueue Q) // 返回Q的元素个数; Status QueueTraverse(SqQueue Q)// 若队列不空,则从队头到队尾依次输出各个队列元素,并返回OK;否则返回ERROR. 3.用户使用说明 运行程序,根据屏幕上的文字提示一步步操作。 4.个人测试结果(截图) 部分测试结果截图

c语言汉诺塔

汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。 一位法国数学家曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面。僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔、庙宇和众生也都将同归于尽。 不管这个传说的可信度有多大,如果考虑一下把64片金片,由一根针上移到另一根针上,并且始终保持上小下大的顺序。这需要多少次移动呢?这里需要递归的方法。假设有n片,移动次数是f(n).显然f(1)=1,f(2)=3,f(3)=7,且 f(k+1)=2*f(k)+1。此后不难证明f(n)=2^n-1。n=64时, f(64)= 2^64-1=18446744073709551615 假如每秒钟一次,共需多长时间呢?一个平年365天有 31536000 秒,闰年366天有31622400秒,平均每年31556952秒,计算一下, 18446744073709551615/31556952=584554049253.855年 这表明移完这些金片需要5845亿年以上,而地球存在至今不过45亿年,太阳系的预期寿命据说也就是数百亿年。真的过了5845亿年,不说太阳系和银河系,至少地球上的一切生命,连同梵塔、庙宇等,都早已经灰飞烟灭。 算法介绍 其实算法非常简单,当盘子的个数为n时,移动的次数应等于2^n –1(有兴趣的可以自己证明试试看)。后来一位美国学者发现一种出人意料的简单方法,只要轮流进行两步操作就可以了。首先把三根柱子按顺序排成品字型,把所有的圆盘按从大到小的顺序放在柱子A上,根据圆盘的数量确定柱子的排放顺序:若n为偶数,按顺时针方向依次摆放 A B C; 若n为奇数,按顺时针方向依次摆放 A C B。 (1)按顺时针方向把圆盘1从现在的柱子移动到下一根柱子,即当n为偶数时,若圆盘1在柱子A,则把它移动到B;若圆盘1在柱子B,则把它移动到C;若圆盘1在柱子C,则把它移动到A。 (2)接着,把另外两根柱子上可以移动的圆盘移动到新的柱子上。即把非空柱子上的圆盘移动到空柱子上,当两根柱子都非空时,移动较小的圆盘。这一步没有明确规定移动哪个圆盘,你可能以为会有多种可能性,其实不然,可实施的行动是唯一的。 (3)反复进行(1)(2)操作,最后就能按规定完成汉诺塔的移动。 所以结果非常简单,就是按照移动规则向一个方向移动金片: 如3阶汉诺塔的移动:A→C,A→B,C→B,A→C,B→A,B→C,A→C

汉诺塔问题C语言程序设计

三峡大学理学院2011级电信专业 《高级语言程序设计》课程设计 说明书 设计题目: 汉诺塔的搬移过程设计 班级:高级语言程序设计1 班 学号:2011142227 姓名:徐飞 完成日期:2012 年6月20日 1设计任务 设计题目:用递归法计算解决汉诺塔问题,并能够演示解决汉诺塔问题过; 要求:设计一个运用递归法计算解决汉诺塔问题C语言程序; 2 汉诺(Hanoi)塔问题的提出 古代有一个梵塔,塔内有A,B,C,3个座,座A上有64个大小不等的盘子,大的在下,小的在上(如下图)。有一个和尚想把这64个盘子从座A全部移到座C ,在移动过程中可以借用座A,座B或座C,但每次只允许移动一个盘子,并且不允许大盘放在小盘的上面。 3编程思路 首先,要找出递归的两个关键点,即: 递归终止条件:只有一个盘子时,可以移动。 递归表达式:要找出递归表达式,可以如下设想:

下面以3个盘子为例说明详细的移动过程: (1)将座A上的2个盘子移动到座B上; (2)将座A上的1个盘子移动到座C上; (3)将座B上的2个盘子移动到座C上; 上面第1步可用递归方法分解为: (1)将座A上的1个盘子从座A移动到座C上;

(2)将座A上的1个盘子从座A移动到座B上; (3)将座C上的1个盘子从座C移动到座B上; 第(3)步可用递归方法分解为: (1)将座B上的1个盘子从座B移动到座A上; (2)将座B上的1个盘子从座B移动到座C上; (3)将座B上的1个盘子从座A移动到座C上; 第(1)步操作可归纳为:将座A上的2个盘子借助座C移到座B; 第(3)步操作可归纳为:将座B上的2个盘子借助座A移到座C; 因此,将n个盘子从座A移到座C可以描述为: (1)将n-1个盘子从座A借助座C移到座B; (2)将剩下的一个盘子从座A移到座C; (3)将n-1个盘子从座B借助座A移到座C; 3系统操作流程图; 4.程序说明;

河内塔问题简介

由来 法国数学家爱德华·卢卡斯曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面。僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔、庙宇和众生也都将同归于尽。 [2] 不管这个传说的可信度有多大,如果考虑一下把64片金片,由一根针上移到另一根针上,并且始终保持上小下大的顺序。这需要多少次移动呢?这里需要递归的方法。假设有n 片,移动次数是f(n).显然f(1)=1,f(2)=3,f(3)=7,且f(k+1)=2*f(k)+1。此后不难证明f(n)=2^n-1。n=64时, 假如每秒钟一次,共需多长时间呢?一个平年365天有31536000 秒,闰年366天有31622400秒,平均每年31556952秒,计算一下: 18446744073709551615秒 这表明移完这些金片需要5845.54亿年以上,而地球存在至今不过45亿年,太阳系的预期寿命据说也就是数百亿年。真的过了5845.54亿年,不说太阳系和银河系,至少地球上的一切生命,连同梵塔、庙宇等,都早已经灰飞烟灭。 印度传说 和汉诺塔故事相似的,还有另外一个印度传说:舍罕王打算奖赏国际象棋的发明人──宰相西萨·班·达依尔。国王问他想要什么,他对国王说:“陛下,请您在这张棋盘的第1个小格里赏给我一粒麦子,在第2个小格里给2粒,第3个小格给4粒,以后每一小格都比前一小格加一倍。请您把这样摆满棋盘上所有64格的麦粒,都赏给您的仆人吧!”国王觉得这个要求太容易满足了,就命令给他这些麦粒。当人们把一袋一袋的麦子搬来开始计数时,国王才发现:就是把全印度甚至全世界的麦粒全拿来,也满足不了那位宰相的要求。 那么,宰相要求得到的麦粒到底有多少呢?总数为 1+2+2^2 + … +2^63=2^64-1 等于移完汉诺塔所需的步骤数。我们已经知道这个数字有多么大了。人们估计,全世界两千年也难以生产这么多麦子! [3]

相关文档
最新文档