- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第7章的 函数
第三步:将B柱上的(n-1)个盘子,借助A柱移到C柱上,需移an-1次; 所以有 an=2an-1+1 易知 a1=1,a2=3 容易求出 an=2n-1 设移动一个盘子一次需要1秒种,将64个盘子移完需要: 264-1秒=18446744073709551615秒≈213503982334601天 ≈584942417355年≈5849亿年 下面我们来看看如何编程解决这个问题。 【例7.23】Hanoi(汉诺)塔问题。(续) 如果只有1个盘子,问题很容易解决; 如果有2个盘子,问题也容易解决; 如果有3个盘子,问题也不难解决; 如果有4个盘子,问题一下子就复杂多了; 如果有5个盘子,请同学们试着做一下,每一步应该怎样移动盘子呢? 【例7.23】Hanoi(汉诺)塔问题。(续) 对于64个盘子,很难直接写出移动盘子的具体步骤。 此时,我们自然会这样想:假如有第2个人能将A柱上面的63个盘子借助C柱移到B柱上。那么,问题就解决了。此时我们只需这样做: ⑴ 将A柱剩下的一个最大的盘子直接移到C柱上; ⑵ 再让第2个人将B柱上63个盘子借助A柱移到C柱上 。 【例7.23】Hanoi(汉诺)塔问题。(续) 至此,任务全部完成了。这里采用了递归方法。但是,有一个问题还未解决,第2个人怎样才能将A柱上面的63个盘子借助C柱移到B柱上呢? 为了解决这个问题,第2个人又想:如果有第3个人能将B柱上面的62个盘子借助C柱移到A柱上。第2个人就可以这样做: ⑴ 自己将B柱剩下的一个最大的盘子(原64个盘子中第二大的盘子)直接移到C柱上; ⑵ 再让第3个人将A柱上62个盘子借助B柱移到C柱上。 【例7.23】Hanoi(汉诺)塔问题。(续) 再进行一次递归。如此下去,直到后来找到第64个人,让他将1个盘子(原64个盘子中最小的盘子)从A柱(或B柱)直接移到C柱上。至此,所有工作全部落实,而且都是可以实现的。 为使问题简化,我们先分析3个盘子的移动全过程: 1.1 将A柱上面的2个盘子借助C柱移到B柱上; 1.2 将A柱剩下的1个最大的盘子直接移到C柱上; 1.3 将B柱2个盘子借助A柱移到C柱上。 其中第1.1步可用递归方法分解为: 【例7.23】Hanoi(汉诺)塔问题。(续) 2.1 将A柱最上面1个盘子直接移到C柱上; 2.2 将A柱最上面1个盘子直接移到B柱上; 2.3 将C柱最上面1个盘子直接移到B柱上。 第1.3步也可用递归方法分解为: 3.1 将B柱最上面1个盘子直接移到A柱上; 3.2 将B柱剩下的最后1个盘子直接移到C柱上; 3.3 将A柱剩下的最后1个盘子直接移到C柱上。 从上面的分析可以归纳出移动3个盘子的步骤为: A→C,A→B,C→B,A→C,B→A,B→C,A→C。 【例7.23】Hanoi(汉诺)塔问题。(续) 程序如下: #include stdio.h void move(char x,char y) { printf(%c--%c\n,x,y); } 【例7.23】Hanoi(汉诺)塔问题。(续) 程序如下:(续) void hanoi(int n,char one,char two,char three)/*将n个盘子 从one柱移到three柱上,借助two柱*/ { if(n==1) move(one,three); else { hanoi(n-1,one,three,two); move(one,three); hanoi(n-1,two,one,three); } } 【例7.23】Hanoi(汉诺)塔问题。(续) 程序如下:(续) void main( ) { int m; printf(Input the number of diskes:); scanf(%d,m); printf(The step to moving %2d diskes:\n,m); hanoi(m,A,B,C); } 程序运行 情况示例: 程序中的move( )函数并不是真正移动盘子,而只是显示盘子从哪一根柱子移动哪一根柱子上。 本章小结 本章介绍了函数的定义、声明和调用,变量的作用域和存
文档评论(0)