- 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章 递归与分治策略
第2章 递归与分治策略;将要求解的较大规模的问题分割成k个更小规模的子问题。;算法总体思想;算法总体思想;算法总体思想;2.1 递归的概念;例1 阶乘函数
阶乘函数可递归地定义为:;第n个阶乘函数可递归地计算如下:
public static int factorial(int n)
{
if (n == 0) return 1;
return n * factorial(n-1);
}
;例2 Fibonacci数列
无穷数列1,1,2,3,5,8,13,21,34,55,…,被称为Fibonacci数列。它可以递归地定义为:;例3 Ackerman函数
当一个函数及它的一个变量是由函数自身定义时,称这个函数是双递归函数。
Ackerman函数A(n,m)定义如下:
;
前2例中的函数都可以找到相应的非递归方式定义:;例3 Ackerman函数
A(n,m)的自变量m的每一个值都定义了一个单变量函数:
m=0时,A(n,0)=n+2
m=1时,A(n,1)=A(A(n-1,1),0)=A(n-1,1)+2,和A(1,1)=2故A(n,1)=2*n
m=2时,A(n,2)=A(A(n-1,2),1)=2A(n-1,2),和A(1,2)=A(A(0,2),1)=A(1,1)=2,故A(n,2)= 2n 。
m=3时,类似的可以推出A(n,3)=
m=4时,A(n,4)的增长速度非常快,以至于没有适当的数学式子来表示这一函数。
;定义单变量的Ackerman函数A(n)为,A(n)=A(n,n)。
定义其拟逆函数α(n)为:α(n)=min{k|A(k)≥n}。即α(n)是使n≤A(k)成立的最小的k值。
α(n)在复杂度分析中常遇到。对于通常所见到的正整数n,有α(n)≤4。但在理论上α(n)没有上界,随着n的增加,它以难以想象的慢速度趋向正无穷大。
;例4 整数划分问题
将正整数n表示成一系列正整数之和:n=n1+n2+…+nk,
其中n1≥n2≥…≥nk≥1,k≥1。
正整数n的这种表示称为正整数n的划分。求正整数n的不
同划分个数。
例如正整数6有如下11种不同的划分:
6;
5+1;
4+2,4+1+1;
3+3,3+2+1,3+1+1+1;
2+2+2,2+2+1+1,2+1+1+1+1;
1+1+1+1+1+1。
;(2) q(n,m)=q(n,n),m?n;
最大加数n1实际上不能大于n。因此,q(1,m)=1。
;
; public static int q(int n, int m)
{
if ( (n 1) ‖ (m 1) )return 0;
if ( (n ==1) ‖ (m = =1) ) return 1;
if (n m ) return q(n,n);
if (n ==m ) return q(n,m-1)+1;
return q(n , m-1)+ q(n-m,m )
}
;;例6 Hanoi塔问题
设a,b,c是3个塔座。开始时,在塔座a上有一叠共n个圆盘,这些圆盘自下而上,由大到小地叠在一起。各圆盘从小到大编号为1,2,…,n,现要求将塔座a上的这一叠圆盘移到塔座b上,并仍按同样顺序叠置。在移动圆盘时应遵守以下移动规则:
规则1:每次只能移动1个圆盘;
规则2:任何时刻都不允许将较大的圆盘压在较小的圆盘 之上;
规则3:在满足移动规则1和2的前提下,可将圆盘移至a,b,c中任一塔座上。;在问题规模较大时,较难找到一般的方法,因此我们尝试用递归技术来解决这个问题。
;递归小结;分析递归算法时间效率的通用方案;算法可视法;2.2分治法的基本思想;分治法的基本步骤;分治法的复杂性分析;2.3二分搜索技术;给定已按升序排好序的n个元素a[0:n-1],现要在这n个元素中找出一特定元素x。;X =
Y =
X = a 2n/2 + b Y = c 2n/2 + d
XY = ac 2n + (ad+bc) 2n/2 + bd ;XY = ac 2n + (ad+bc) 2n/2 + bd
为了降低时间复杂度,必须减少乘法的次数。
XY = ac 2n + ((a-c)(b-d)+ac+bd) 2n/2 + bd
XY = ac
文档评论(0)