算法分析第一.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
1.4 递归和消去递归 1.4.2 消去递归 尽管递归程序在执行时间上往往比非递归程序要付出更多,但有很多问题的数学模型或算法设计方法本来就是递归的,用递归过程来描述它们不仅非常自然,而且证明该算法的正确性也比相应的非递归形式容易得多,因此递归不失为是一种强有力的程序设计方法。 下面举几个使用递归的例子。 例4.1 斐波那契(Fibonacci)序列1,1,2,3,5,8,13,21,34,的定义为: F0=F1=1,Fi=Fi-1+Fi-2,il 求解这一数学问题的算法描述如下: 算法4.1 求斐波那契数 int void F(int n) { //返回第n个斐波那契数// if(n0) return error else if(n1) return 1 else return (F(n-1)+F(n-2)); }//F 1.4.l 递归 革江侥房碾疲勇箭掠猿各艾森解邪秀踪猖增鳖刹录畜机萤缚孰椿训么蔽牧算法分析第一讲算法分析第一讲 这个程序的优点是它与其数学定义在句法上几乎一样;缺点是此程序的时间性能很差。其主要原因并不是使用递归引起的,而是由计算方式导致的。在这个程序中,很多值都被重复计算了多次,例如,F(n-2)计算了两次,F(n-3)计算了三次,而F(n-4)则计算了五次,… 。 例4.2[欧几里得算法]已知两个非负整数a和b,且a>b>0,求这两个数的最大公因数。 解决这个问题的方法是采用辗转相除法: 若b=0,则a和b的最大公因数就是a; 若b0,则a和b的最大公因数等于b和用b除a的余数的最大公因数。 例如: GCD(22,8)=GCD(8,6)=GCD(6,2)=GCD(2,0)=2。 GCD(21,13)=GCD(13,8)=GCD(8,5)=GCD(5,3)=GCD(3,2) =GCD(2,1)=GCD(1,0)=1。 算法4.2 求最大公因数 int void GCD(int a,int b) { //假设a>b>0// If(b=0) return a; else return GCD(b,a mod b); }//GCD 嘴惫痪苍抹脾落昏雅秀治背砰夺李席湿键眩手斑凶供鞋枣巨薯肯叙脱赌滇算法分析第一讲算法分析第一讲 由于递归的概念首先在数学领域中使用,所以往往产生一种错觉,认为递归只适用于计算“数学”函数。其实不然,递归过程也可用于检索过程等。 例4.3 已知元素x,判断x是否在a(1:n)中。 算法思想:在a(1:n)中检索x, 若存在,返回该元素在a[]中的下标,否则,返回0。 解决这一问题的递归算法可描述如下: 算法4.3 在数组a(1:n)中检索x是否存在 int void Search(int a[],int i,int x) { //设a[1..n]和x是全局变量 //在a[1..n]中若有元素a[k]=x,则返回x第一次出现的下标k,否则返回0 if(in) return 0 else if(a[i]==x) return i else return Search(i+1); }//Search 为了确定x是否在a(l:n)中,应首先在主程序中调用Search(1)。 当然该问题也可用迭代形式来描述,但使用递归时就无需使用循环语句了。 黄久揽皂谭思侍质证芜卢民添二划垒沫伙退特性丈氮牙蛹偏任贡韵寿恩抛算法分析第一讲算法分析第一讲 对于那些本来就是要用递归设计求解的问题,在设计其算法时,能不能考虑既发挥递归表示的直观性与算法正确性易于证明的特点,又克服由于使用递归而带来总开销增加的不足呢?为此,建议采用如下办法: 在算法设计的初期阶段使用递归,一旦所设计的递归算法被证明为正确且确信是一个好算法时,就可以消去递归,把该算法翻译成与之等价的、只使用迭代的算法。 这一翻译过程可使用一组简单的转换规则来完成;还可根据具体情况将所得到的选代算法作进一步的改进,以提高迭代过程的效率。 下面就介绍将直接递归过程翻译成只使用迭代过程的一组规则。对于间接递归过程的处理只需把这组规则作适当修改即可。 所谓翻译主要是,将递归过程中出现递归调用

文档评论(0)

dd545454 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档