- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第2章 递归与分治策略;学习要点:
理解递归的概念。
掌握设计有效算法的分治策略。
通过下面的范例学习分治策略设计技巧。
(1)二分搜索技术;
(2)合并排序
(3)快速排序;
(4)最接近点对问题;
;递归(recursion)是数学与计算机科学中的基本概念。直接或间接地调用自身的算法称为递归算法。用函数自身给出定义的函数称为递归函数。
递归程序不能无限制地自我调用,否则就会永不终止,递归程序必须有终止条件。
尽管递归程序在执行时间上往往比非递归程序要付出更多的代价,但有很多问题的数学模型或算法设计方法本来就是递归的,用递归过程来描述它们不仅非常自然, 而且证明该算法的正确性要比相应的非递归形式容易得多,因此递归不失为一种强有力的程序设计方法。
;构成递归需具备的条件:;例1 阶乘函数
阶乘函数可递归地定义为:;例2 Fibonacci(斐波那齐)数列
无穷数列1,1,2,3,5,8,13,21,34,55,……,称为Fibonacci数列。它可以递归地定义为:;斐波那齐数列算法的递归结构(n=5) ;求斐波那齐数列的非递归程序:;前2例中的函数都可以找到相应的非递归方式定义:;例3 Hanoi塔问题
设x,y,z是3个塔座。开始时,在塔座x上有一叠共n个圆盘,这些圆盘自下而上,由大到小地叠在一起。各圆盘从小到大编号为1,2,…,n,现要求将塔座x上的这一叠圆盘移到塔座z上,并仍按同样顺序叠置。在移动圆盘时应遵守以下移动规则:
规则1:每次只能移动1个圆盘;
规则2:任何时刻都不允许将较大的圆盘压在较小的圆盘之上;
规则3:在满足移动规则1和2的前提下,可将圆盘移至x,y,z中任一塔座上。;汉诺塔的执行过程;;void hanoi (int n, int x, int y, int z) // 将塔座 x 上按直径由小到大且至上而下编号为1至 n // 的 n 个圆盘按规则搬到塔座 z 上,y 可用作辅助塔座。 { if (n==1) { move(x, 1, z); // 将编号为1的圆盘从 x 移到 z } else
{ hanoi(n-1, x, z, y);// 将x上编号为1至n-1的圆盘移到y,z作辅助塔 move(x, n, z); // 将编号为 n 的圆盘从 x 移到 z hanoi(n-1, y, x, z); //将y上编号为1至n-1的圆盘??到z,x作辅助塔 } };递归函数的运行轨迹 ;Hanio(3,A,B,C);递归函数的内部执行过程 ;递归小结;解决方法:在递归算法中消除递归调用,使其转化为非递归算法。
1、采用一个用户定义的栈来模拟系统的递归调用工作栈。该方法通用性强,但本质上还是递归,只不过人工做了本来由编译器做的事情,优化效果不明显。
2、用递推来实现递归函数。
3、通过变换能将一些递归转化为尾递归,从而迭代求出结果。
后两种方法在时空复杂度上均有较大改善,但其适用范围有限。;2.2分治法;2. 独立子问题:各子问题之间相互独立,这涉及到分治法的效率,如果各子问题不是独立的,则分治法需要重复地解公共的子问题。 ; 子问题1
的规模是n/2;分治法的求解过程 ; 例:计算an,应用分治技术得到如下计算方法:;分治法的适用条件;divide-and-conquer(P)
{
if ( | P | = n0) adhoc(P); //解决小规模的问题
divide P into smaller subinstances P1,P2,...,Pk;//分解问题
for (i=1,i=k,i++)
yi=divide-and-conquer(Pi); //递归的解各子问题
return merge(y1,...,yk); //将各子问题的解合并为原问题的解
};设问题P(n)分解成k个规模为n/m的子问题,阀值n0=1,求解P(1)的
时间耗费为O(1).将P(n)分解及合并成P(n)的解的时间为f(n),则
分治法解规模为n的问题的最坏时间复杂性函数T(n)满足:; T(n) = kT(n / m) + f(n)
= k(kT(n / m2) + f(n / m)) + f(n)
= k2T(n / m2) + kf(n / m)) + f(n)
= k3T(n / m3) + k2f(n / m2)) +kf(n / m)) + f(n) = ??
;二分搜索技术;分析:如
文档评论(0)