1递归与分治法资料.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
1 递归与分治法; 学习要点: 递归 分治策略 范例 (1)汉诺塔问题; (2) 插入排序; (3)最大值和最小值问题; (4) 归并排序和快速排序; (5) 线性时间选择; (6) 二分搜索技术; 思考题:循环赛日程表。;递归算法解题通常有三个步骤: (1)分析问题、寻找递归:找出递归方程式。 (2)设置边界、控制递归:找出递归终止条件,即 算法易解的最小规模问题。 (3)设计函数、确定参数。;例1.1.1 计算阶乘函数n! 输入:n 输出:n! int factorial(int n) { if (n==0) return 1; //基础步,终止性 else return n*factorial(n-1); // 归纳步,收敛性 } ;基本操作: n * factorial(n-1) 递归方程: f(n)=f(n-1)+1 =(f(n-2)+1)+1=f(n-2)+2 ……………… =f(n-n)+n=f(0)+n=n 时间复杂性:O(n) 空间复杂性: 每一次递归,都分配常数个工作单元用于递归栈,递归深度为n。所以,空间复杂性:O(n) ;例1.1.2 整数羃的计算----xn ;基本操作: x * power(x,n-1) 递归方程: f(n)=f(n-1)+1 =(f(n-2)+1)+1=f(n-2)+2 ……………… =f(n-n)+n=f(0)+n=n 时间复杂性:O(n) 空间复杂性:O(n) ;;;例3.1.3 基于递归的插入排序。 输入:数组A[ ], 数组的元素个数n ; 输出:按递增顺序排序的数组A[ ] 分析: 1)边界条件:数组只有一个元素,它已经是排序的; 2)递归条件:如果前面n-1个元素已经按递增顺序排序,只要对第n个元素逐一与前面个元素比较,把它插入适当的位置,即可完成个元素的排序。;;;例1.1.4 求Fibonacci数列的第n项。 ( 1,1,2,3,5,8,13,21,34,5, ……) 分析: 1)边界条件: Fibonacci数列的第1项1,第2项是1 2)递归过程: Fibonacci数列的第n项=第n-1项+第n-2项 int fibonacci(int n) { //n=1 if (n = 2) return 1; return ( fibonacci(n-1)+fibonacci(n-2) ); } T(n)=O(2n) S(n)=O(n);例1.1.5 汉诺塔问题 古代有一个梵塔,塔内有3个基座A、B、C,开始时A基座上有64个盘子,盘子大小不等,大的在下,小的在上。有一个老和尚想把这64个盘子从A座移到B座,但每次只允许移动一个盘子,且在移动过程中在3个基座上的盘子都始终保持大盘在下,小盘在上。在移动过程中可以利用C基座做辅助。 分析: 1)边界条件:只有一个盘子时,直接将它从A座移到B座; 2)递归过程: ①将n-1个盘从A座移到c座,利用B座做辅助; ②将第n个盘A座移到B座; ③将n-1个盘从C座移到B座,利用A座做辅助。;;;递归小结;解决方法:在递归算法中消除递归调用,使其转化为非递归算法。 1、采用栈来模拟系统的递归调用工作栈。该方法通用性强,但本质上还是递归,只不过人工做了本来由编译器做的事情,优化效果不明显。 2、用递推来实现递归函数。 3、通过变换能将一些递归转化为伪递归,从而迭代求出结果。 后两种方法在时空复杂度上均有较大改善,但其适用范围有限。;求Fibonacci数列的第n项(非递归)算法: int fibonacci(int n,int f[]) { int i; f[0]=1; f[1]=1; for (i=2;in;i++) f[i] = f[i-1] + f[i-2] ; return f

文档评论(0)

希望之星 + 关注
实名认证
内容提供者

我是一名原创力文库的爱好者!从事自由职业!

1亿VIP精品文档

相关文档