第二章 递归和分治策略.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第二章 递归与分治策略 本章学习的主要内容 第一节 递归的概念 第二节 分治法的基本思想 第三节 二分搜索技术 第四节 大整数的乘法 第五节 快速排序 第六节 循环赛日程表 第七节 Strassen矩阵乘法 本章学习的主要内容 第八节 合并排序 第九节 棋盘覆盖 第十节 线性时间选择 第一节 递归的概念 分治法的设计思想是,将一个难以直接解决的大问题分割成一些规模较小的相同问题,以便分而治之。 由分治法产生的子问题往往是原问题的较小模式,可以采用递归技术解决这些子问题。 分治与递归经常同时应用在算法的设计上。 2.1 递归的概念 一个直接或间接地调用自身的算法称为递归算法。 例2-1 阶乘函数 阶乘函数递归地定义为: 计算阶乘的程序 int Factorial(int n) { if(n==0) return 1; return n*Factorial(n-1); } 例2-2 Fibonacci数列 1,1,2,3,5,8,13,21,34,55,…称为Fibonacci数列。 计算Fibonacci的程序 int Fibonacci(int n) { if(n=1) return 1; return Fibonacci(n-1)+Fibonacci(n-2); } 例2-3 双递归函数-Ackerman函数 当一个函数及它的一个变量是由函数自身定义时,称这个函数是双递归函数。 双递归函数-Ackerman函数A(n,m),m?0和n?0,其定义如下: A(n,m) m=0时,A(0,0)=1 A(1,0)=2 A(n,0)=n+2, n?2 m=1时,A(0,1)=1 A(1,1)=A(A(0,1),0)=A(1,0)=2 A(2,1)=A(A(2-1,1),0)=A(2,0)=2+2=4=2*2 A(3,1)=A(A(3-1,1),0)=A(4,0)=4+2=6=2*3 … … A(n,1)=A(A(n-1,1),0)=A(n-1,1)+2 A(n-1,1)=A(A(n-2,1),0)+2=A(n-2,1)+2 … … A(3,1)=A(2,1)+2 叠加得 A(n,1)=(n-2)*2+2*2=2n (n?2) A(n,m) m=2时, A(0,2)=1 A(1,2)=A(A(0,2),1)=A(1,1)=2 当n?2 A(n,2)=A(A(n-1,2),1) =2A(n-1,2) A(n-1,2)=A(A(n-2,2),1)=2A(n-2,2) A(n-2,2)=A(A(n-3,2),1)=2A(n-3,2) A(n-3,2)=A(A(n-4,2),1)=2A(n-4,2) … … A(1,2)=A(A(1-1,2),1)=2 相乘得:A(n,2)=2n 2的层数为n (包括所有的2) A(n,4)增长速度非常快,以至于没有适当的数学式子表示。 单变量的Ackerman函数 A(n)=A(n,n) ?(n)=min{ k | A(k)?n },即?(n)是使得A(k)?n成立的最小的k值。 A(0)=A(0,0)=1 ; ?(1)=0 A(1)=A(1,1)=2 ; ?(2)=1 A(2)=A(2,2)=4 ; ?(3)=?(4)=2 A(3)=A(3,3)=16 ; ?(5)=?(6)=…=?(16)=3 ?(n)增长速度非常慢。 2的层数为65536 (包括所有的2) 对于通常所见到的正整数有?(n) ?4 理论上?(n) 没有上界,随着n的增长,它以难以想象的慢速度趋向无穷大。 例2-4 排列问题 设R={r1, r2,…, rn}是要进行排列的n个元素,Ri=R-{ri}。 集合X中元素的全排列记为Perm(X)。 (ri)Perm(X)表示在全排列Perm(X)的每一个排列前加上前缀ri得到的排列。 R的全排列递归定义如下: 当n=1时,Perm(R)=(r1), r1是R中唯一的元素。 当n1时,Perm(R)由(ri)Perm(Ri)(i=1,2,…,n)构成 template class Type void Perm(Type list[],int k,int m) {if(km){ for(int i=0;i=

文档评论(0)

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

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

1亿VIP精品文档

相关文档