递归算法 15p.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文档。上传文档
查看更多
递归算法 15p

递归算法 递归的定义 这个流程如下: void B( ) { ….. } void A( ) { ….. B( ); ….. } void main( ) { ….. A( ); ….. } main函数 A函数 B函数 调用A函数 调用B函数 结束 递归的定义 若一个对象部分地包含它自己,或用它自己给自己定义,则称这个对象是递归的 若一个函数直接地或间接地调用自己,则称这个函数是递归函数(recursive function) 在以下三种情况下,常常用到递归方法 定义是递归的 数据结构是递归的 问题的解法是递归的 递归函数分为直接递归与间接递归 直接递归:在函数中出现调用函数本身 间接递归:在函数中调用了其它函数,而该其 它函数又调用了本函数 两种不同的递归程序图示如下: 递归设计方法 递归设计首先要确定求解问题的递归模型,了解递归的执行过程,在此基础上进行递归程序设计 递归模型 递归模型反映一个递归问题的递归结构,例如 f(1)=1 f(n)=n*f(n-1) n1 第一个式子给出了递归的终止条件,第二个式子给出了f(n)的值与f(n-1)的值之间的关系,我们把第一个式子称为递归出口,把第二个式子称为递归体。 一般地,一个递归模型是由递归出口和递归体两部分组成,前者确定到何时为止,后者确定递归的方式。 实际上,递归是把一个不能或者不好直接求解的大问题转化为一个或者几个小问题来解决,如此分解,直至每个小问题都可以直接解决(此时分解到递归出口) 注意:递归分解不是随意的分解,递归分解要保证大问题与小问题相似,即求解过程与环境相似。 求解f(n)的分解过程如下 f(n) - f(n-1) - f(n-2) …… f(3) - f(2) - f(1) 一旦遇到递归出口,分解过程结束,开始求值过程,所以分解过程是量变,即原来的大问题在慢慢变小,但尚未解决,遇到递归出口后,便发生了质变,即原递归问题转化为直接问题。 上面的求值过程如下: f(n) - f(n-1) - f(n-2) - f(n-3) …… - f(2) - f(1) 这样f(n)就计算出来了,因此,递归的执行过程由分解和求值两部分构成。 由上面的分析可以得出一般的递归设计的步骤如下 (1) 对原问题f(s)进行分析,假设出合理的较小问题f(s’) (2) 假设f(s’)是可解得,在此基础上确定f(s)的解,即给出f(s)与f(s’)的关系 (3) 确定一个特定情况(如f(1)或f(0))的解,由此作为递归出口 递归与循环 递归与循环的相似点 递归程序和循环有一些相似之处,递归程序在调用自己的时候会不断的调用自己,所以肯定有一个判断控制语句,这一个点与循环控制语句相同,因为循环也是有一个判断语句,否者两者都会出现问题,递归会出现无限递归而循环也会出现无限循环。因此递归程序具有循环的功能,所以用循环写的代码可以用递归写的代码代替。 假如字符数组a中存储有一字符串“12345”, 现在需要输出: 5 4 3 2 1 因为递归可以通过系统自动调用堆栈,所以可以这样写: 递归函数示例 阶乘 汉诺塔 递归函数示例——阶乘 用循环实现阶乘计算的函数 long fac(int n) { long s; int i; for(s = 1, i = 1; i = n; i++) s *= i; return s; } 递归函数示例——汉诺塔 汉诺塔问题的目标是把所有的圆盘从最初的第一根柱子移动到最终的那个柱子上。我们利用中间那个柱子作为临时放置圆盘的地方,但必须遵守如下3条规则。 ● 一次只能移动一张圆盘 ●不能将较大圆盘放在较小的圆盘上方 ●除了那张在柱子之间搬动的圆盘之外,所有圆盘都必须放在某根柱子上 假设我们只有三张圆盘,为了将这所有这三张圆盘从第一根柱子移到第三根,首先必须做到——较小的两张圆盘都不再挡道(处在第二根柱子上),这样最大的那张圆盘才能从第一根柱子移到第三根柱子。 下面根据这种思想形成一般性的策略。要将一叠圆盘(N个)从最初的柱子移到最终的柱子: ● 将最上方的N

文档评论(0)

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

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

1亿VIP精品文档

相关文档