其它递归算法应用.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
实战2:递归及应用 叶安胜 递归编程的三个视角—递归编程的理解 视角一 -- 找出递推关系式。 其核心:通过各种形式,找出递推关系和结束条件。 如:书上基本项目一和基本项目二 视角二 -- 完成相同的操作。 其核心:一个复杂问题通过分解成若干个小问题,每一次分解操作都一样。判断结束条件 如:任意进制转换?整数分解? 视角三 -- 树形结构图展示 核心:理解和画递归调用结构图(抽象图) 如:汉诺塔问题,组合元素求解等 递归函数fun()特征: (1)一定需要函数参数 (2) 结束条件一定与参数有关系 一、视角一 -- 递推关系 其核心:通过各种形式,找出递推关系和结束条件。 求解阶乘n! s=n!=n*(n-1)!=n*(n-1)*(n-2)!= n*(n-1)*(n-2)…2*1 递归关系: fun(n)=n*fun(n-1) n1; fun(n)=1 n=0,1 代码编写: int fun(int n) { long s=1; if (n1) s=n*fun(n-1); else s=1; return s; } 二、视角二 -- 完成相同操作 进制转换 三、汉诺塔问题 汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着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天有秒,闰年366天,平均每,计算一下 : 18446744073709551615=?年 。 584554049253.855年 = 5845亿年 这表明移完这些金片需要5845亿年以上,而地球存在至今不过45亿年,太阳系的预期寿命据说也就是数百亿年。真的过了5845亿年,不说太阳系和银河系,至少地球上的一切生命,连同梵塔、庙宇等,都早已经灰飞烟灭。 和汉诺塔故事相似的另外一个印度传说: 舍罕王打算奖赏国际象棋的发明人──宰相西萨·班·达依尔。国王问他想要什么,他对国王说:“陛下,请您在这张棋盘的第1个小格里赏给我一粒麦子,在第2个小格里给2粒,第3个小格给4粒,以后每一小格都比前一小格加一倍。请您把这样摆满棋盘上所有64格的麦粒,都赏给您的仆人吧!”国王觉得这个要求太容易满足了,就命令给他这些麦粒。当人们把一袋一袋的麦子搬来开始计数时,国王才发现:就是把全印度甚至全世界的麦粒全拿来,也满足不了那位宰相的要求。 那么,宰相要求得到的麦粒到底有多少呢? 需要的麦子是 1+2+2^2 + … +2^64-1 . 比移完汉诺塔的次数还要多。我们已经知道这个数字有多么大了。人们估计,全世界两千年也难以生产这么的麦子。 用一年=60秒x60分x24小时x365天来算的话,大约有5800亿年吧 。 太阳及其行星形成于50亿年前,其寿命约为100亿年。 汉诺塔问题在数学界有很高的研究价值,而且至今还在被一些数学家们所研究。 算法分析 只有1个盘子的情况 2个盘子的情况 3个盘子的情况 7个盘子的情况 N个盘子的情况: (1)将n-1个盘子从A?B; (2)将第n个盘子从A?C; (3)将n-1个盘子从B?C 递归实现代码 #includestdio.h int count=0; void hanoi(int

文档评论(0)

xiaozu + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档