- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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)