第2章递归与分治策略PPT课件

合集下载

算法设计与分析 递归与分治策略

算法设计与分析  递归与分治策略
• • • • • • 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。
9
2.1 递归的概念
例4 排列问题
递归算法生成n个元素{r1,r2,…,rn}的全排列。 设R={r1,r2,…,rn}是要进行排列的n个元素, Ri=R-{ri}。去掉元素ri。 集合X中元素的全排列记为perm(X)。 (ri)perm(X)表示在全排列perm(X)的每一个排列 前加上前缀得到的排列。 R的全排列可归纳定义如下:板
3
计划授课时间:6~8课时
2.1 递归的概念
直接或间接地调用自身的算法称为递归算法 用函数自身给出定义的函数称为递归函数(板) 使用递归技术使算法的描述简洁、易理解。 在实时系统或嵌入系统开发中,建议不使用 递归算法 下面来看几个实例。
4
2.1 递归的概念
例1 阶乘函数(板) 可递归地定义为:高低 1 n0 其中: n! n(n 1)! n 0 n=0时,n!=1为结束条件 n>0时,n!=n(n-1)!为递归方程 结束条件也称为边界条件,这二者是递归函 数的二个要素。 T=1; //递归结束条件为循环初值 递归为递推 for (i=2;i<n+1;i++){T=T*i;} 循环低高
算法设计与分析
第二章 递归与分治策略Fra bibliotek杨圣洪
学习要点: 理解递归的概念。 掌握设计有效算法的分治策略。 通过下面的范例学习分治策略设计技巧。 (1)二分搜索技术; (2)大整数乘法; (3)Strassen矩阵乘法; (4)棋盘覆盖; (5)合并排序和快速排序; (6)线性时间选择; (7)最接近点对问题; (8)循环赛日程表。

计算机专业课《算法》_第二章 递归与分治策略

计算机专业课《算法》_第二章 递归与分治策略

“Hanoi 塔”问题演示 a 初始 a 步骤1 a
c
b
c
“Hanoi 塔”问题程序
void hanoi(int n,a,b,c)
{ if n == 1 move( 1, a, b );
else { hanoi( n-1, a, c, b );
move(n, a, b ); hanoi( n-1, c,b, a) ;
• 递归优点:结构清晰,可读性强
• 递归缺点:递归算法的运行效率较低,无论是耗 费的计算时间还是占用的存储空间都比非递归算 法要多。
整数划分问题的递归关系q(n,m)
如设p(n)为正整数n的划分数,则难以找到递归关系 • q(n,m):正整数n的不同的划分中,最大加数不 大于m的划分个数个数 q(n,m)=
1 q(n,n) 1+q(n,n-1) q(n,m-1)+q(n-m,m) n=1, m=1 n<m n=m n>m>1
递归函数举例(5)
学习要点
理解递归的概念。 掌握设计有效算法的分治策略。
通过典型范例,学习分治策略设计技巧。
2.1 递归的概念
• 递归算法:一个直接或间接地调用自身的算法 • 递归方程:对于递归算法,一般可把时间代 价表示为一个递归方程 • 递归函数:使用函数自身给出定义的函数 • 解递归方程最常用的方法是进行递归扩展
递归函数举例(1)
• 阶乘函数 n !=
1 n(n-1)! n=1 n>1
• Fibonacci数列
1 n=0
F(n)=
1 F(n-1)+F(n-2)
n=1 n>1
初始条件与递归方程是递归函数的二个要素

第2章递归与分治策略

第2章递归与分治策略

1
q(n,
m)
q(n, n) 1 q(n, n 1)
q(n, m 1) q(n m, m)
n 1, m 1 nm nm
n m 1
正整数n的划分数p(n)=q(n,n)。
பைடு நூலகம்
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); }
} 人们从大量实践中发现,在用分治法设计算法时, 最好使子问题的规模大致相同。即将一个问题分成 大小相等的k个子问题的处理方法是行之有效的。 这种使子问题规模大致相等的做法是出自一种平衡 (balancing)子问题的思想,它几乎总是比子问题 规模不等的做法要好。
T(n)
=n
n/2
n/2
n/2
n/2
T(n/4)T(n/4)T(n/4)T(n/4) T(n/4)T(n/4)T(n/4)T(n/4) T(n/4)T(n/4)T(n/4)T(n/4) T(n/4)T(n/4)T(n/4)T(n/4
算法总体思想
将求出的小规模的问题的解合并为一个更大规模的问 题的解,自底向上逐步求出原来问题的解。
分治与递归像一对孪生兄弟,经常同时应用 在算法设计之中,并由此产生许多高效算法。
下面来看几个实例。
2.1 递归的概念
例1 阶乘函数 阶乘函数可递归地定义为:
n!
1 n(n 1)!
n0 n0
边界条件 递归方程

[理学]算法设计与分析课件 第2章 递归与分治_OK

[理学]算法设计与分析课件 第2章 递归与分治_OK

• 当n>1时,perm(R) 由
(r1)perm(R1) (r2)perm(R2) ………
(rn)perm(Rn)
• 构成。(其中:Ri=R- { ri } )
12 四川师范大学 计算机科学学院 刘芳
2.1 递归的概念
• 例5 整数划分问题 • 将一个正整数n表示成形如下式的一系列正整数的和,称为n的一个划分。 • 形如:
2
A(n, 3) 222
A(A(n 1,m),m 1) n,m 1
n
2
A(3, 4) 222
65536
11
四川师范大学 计算机科学学院 刘芳
2.1 递归的概念
• 例4 数列的全排列问题
perm(R) • 求n个元素R={r1,r2,…,rn}的全排列

• 分析:
• 当n=1时,perm(R)=(r)
第2章 递归与分治策略
• 2.1 递归的概念 • 2.2 分治法的基本思想 • 2.3 分治法的应用 • 本章小结
1 Ó 2005 四川师范大学 计算机科学学院 刘芳
• 嵌套与递归
2.1 递归的概念
2 四川师范大学 计算机科学学院 刘芳
2.1 递归的概念
例1: 阶乘函数
阶乘函数可递归地定义为:
9
四川师范大学 计算机科学学院 刘芳
2.1 递归的概念
例3 Ackerman函数
当一个函数及它的一个变量是由函数自身定义时,称这个函 数是双递归函数。
Ackerman函数A(n,m)定义如下:
2
A(n,
m)
1 n
2
A( A(n 1, m), m 1)
n 1, m 0 n 0, m 0 n 2, m 0

第2章(397)教材配套课件

第2章(397)教材配套课件

2
then return n
3 return F(n 1) + F(n 2)
第2章 分治法
图2-1表示斐波那契算法在输入规模n=6时的递归结构, 其中的每个F(·)表示对递归函数的一次调用,叶结点表示递 归终止时的调用,即斐波那契算法F(n)中第2行的返回值。
第2章 分治法 图2-1 斐波那契算法的递归结构(n=6)
主方法依赖于以下定理。这个定理也称为主定理。
第2章 分治法 定理2.1 设a≥1,b>1为常数,f(n)为一函数。T(n)由 以下递归方程定义:
T(n)=aT(n/b)+f(n) 其中n为非负整数,则T(n)有如下的渐近界限:
(1) 若对某些 常数 > 0,有 f(n) = O(nlogb a-),那么 T(n) =
只要选取d≥(16/13)c,最后一步便成立。
第2章 分治法
2.1.4 主方法 主方法(master method)为我们提供了解如下形式递归方
T(n)=aT(n/b)+f(n)
(2.1)
其中a≥1,b>1为常数,f(n)是渐近正函数。递归方程(2.1)描
述了算法的运行时间。算法将规模为n的问题划分成a个子问
递归过程在实现时,可用一个等价的递归栈来实现过程 的嵌套调用。递归的深度就是在整个计算中过程嵌套调用的 最大程度。通常,深度取决于输入规模。因此,对于大型问 题,栈所需的空间可能妨碍我们使用递归方法求解。图2-3 表示n=4时汉诺塔算法的运行过程。
第2章 分治法 图 2-3 汉诺塔的运行过程(n=4)
( nlogb a)。
(2) 若 f(n) = (nlogb a),那么 T(n) = ( nlogb a lg n)。

递归与分治-PPT课件

递归与分治-PPT课件
递归与分治
递归函数设计
• 阶乘的计算公式
• 换一种思路可以写成
自 底 向 上 计 算 结 果
2
递归函数设计
• 阶乘公式可以写成
• 这其实就是递归的思想,即函数的定义中 使用函数自身的方法 • 除了计算机科学中,还有更多的递归的例 子
3
递归的例子
从前有座山,山里有座庙,庙 里有个老和尚,正在给小和尚 讲故事呢!故事是什么呢? “从 前有座山,山里有座庙,庙里 有个老和尚,正在给小和尚讲 故事呢!故事是什么呢? “从前 有座山,山里有座庙,庙里有 个老和尚,正在给小和尚讲故 事呢!故事是什么呢?……””
函数幕后
fac(5) 5 * fac(4) 4 * fac(3) 3 * fac(2)
15
def fac(N): if N <= 1: return 1 else: return N * fac(N-1)
函数幕后
fac(5) 5 * fac(4) 4 * fac(3) 3 * fac(2) 2 * fac(1)
4
递归的例子
• 德罗斯特效应
– Droste effect – 是递归的一种视觉形式 – 是指一张图片的某个部分与整张图片相同,如 此产生无限循环。
5
德罗斯特效应
6
德罗斯特效应
7
设计递归函数
• 程序设计中如何设计这样的函数呢?
1 2
def fac(N): return N * fac(N-1)
函数幕后
fac(5)
Result:
120
22
递归函数设计
挖掘自相似的特性
产生简介、优雅的代码
更少的工作!
def fac(N):

第2讲 递归与分治策略

第2讲 递归与分治策略
第2讲 递归与分治策略
递归的概念 分治法的基本思想
分治法范例学习
第2讲 递归与分治策略
2.1 递归的概念
• 直接或间接地调用自身的较小模式 的算法称为递归算法。
• 用函数自身的较小模式给出其定义 的函数称为递归函数。
第2讲 递归与分治策略
递归算法的特点
• 递归就是在过程或函数里调用自身。 • 在使用递归策略时,必须有一个明确的递归结 束条件,称为递归出口。 • 递归算法解题通常显得很简洁,但递归算法解 题的运行效率较低。所以一般不提倡用递归算 法设计程序。 • 在递归调用的过程当中系统为每一层的返回点、 局部量等开辟了栈来存储。递归次数过多容易 造成栈溢出等,所以一般不提倡用递归算法设 计程序。
第2讲 递归与分治策略
• 有趣的兔子问题

一般而言,兔子在出生两个月后,就有 繁殖能力,一对兔子每个月能生出一对 小兔子来。如果所有兔子都不死,那么 一年以后可以繁殖多少对兔子?
第2讲 递归与分治策略
• 分析如下: 第一个月小兔子没有繁殖能力,所以还是一对; 两个月后,生下一对小兔子,总数共有两对; 三个月以后,老兔子又生下一对,因为小兔子还没有繁殖 能力,总数共是三对; …… 依次类推可以列出下表:
例6
Hanoi塔问题
设a,b,c是3个塔座。开始时,在塔座a上有一叠共n个圆盘, 这些圆盘自下而上,由大到小地叠在一起。各圆盘从小到大编号 为1,2,…,n,现要求将塔座a上的这一叠圆盘移到塔座b上,并仍 按同样顺序叠臵。在移动圆盘时应遵守以下移动规则: 规则1:每次只能移动1个圆盘; 规则2:任何时刻都不允许将较大的圆盘压在较小的圆盘之上; 规则3:在满足移动规则1和2的前提下,可将圆盘移至a,b,c中任 一塔座上。

递归与分治2

递归与分治2

如何实现移动圆盘的操作呢?当n=1时,问题比较简单,只 要将编号为1的圆盘从塔座X直接移动到塔座Z上即可;当n>1时,
需利用塔座Y作辅助塔座, 若能设法将压在编号为n的圆盘上
的n-1个圆盘从塔座X(依照上述原则)移至塔座Y上, 则可先将 编号为n的圆盘从塔座X 移至塔座Z上,然后再将塔座Y上的n-1 个圆盘(依照上述原则)移至塔座Z上。而如何将n-1个圆盘从一 个塔座移至另一个塔座问题是一个和原问题具有相同特征属性
2) 递归结构 例:n阶Hanoi塔问题:假设有三个分别命名为X、Y和Z
的塔座, 在塔座X上插有n个直径大小各不相同、依小到大
编号为1, 2, …, n的圆盘。现要求将X轴上的n个圆盘移至塔 座Z上并仍按同样顺序叠排,圆盘移动时必须遵循下列原则: (1) 每次只能移动一个圆盘; (2) 圆盘可以插在X、 Y和Z中的任何一个塔座上; (3) 任何时刻都不能将一个较大的圆盘压在较小的圆盘之 上。
ห้องสมุดไป่ตู้


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 那split(6, 4)的值是最大加数小于4(即m-1)划分数split(n, m - 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(即n-m)的划分数split(n - m, m) 4+2,4+1+1; 的和。 因此,split(n, m)可表示为split(n, m - 1) + split(n - m, m))
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第2章 递归与分治策略
作业
.
1
学习要点:
• 理解递归的概念。
• 掌握设计有效算法的分治策略。
• 通过下面的范例学习分治策略设计技巧。
(1)二分搜索技术;
(2)大整数乘法;
(3)Strassen矩阵乘法;
(4)棋盘覆盖;
(5)合并排序和快速排序;
(6)线性时间选择;
(7)最接近点对问题;
(8)循环赛日程表。
A(1,2)=A(A(0,2),1)=A(1,1)=2,故A(n,2)= 2n 。
2 m=3时,类似的可以推出 222 ,其中 2的层数为n
m=4时,A(n,4)的增长速度非常快,以至于没有适当的数学式 子来表示这一函数。
.
11
2.1 递归的概念
例3 Ackerman函数 定义单变量的Ackerman函数A(n)为,A(n)=A(n,
.
10
2.1 递归的概念
例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),和
.
2
2.1 递归的概念与思想
直接或间接地调用自身的算法称为递归算法。 使算法的描述简单明了、易于理解、容易编程和
验证。 很多复杂问题使用递归技术,可能容易而有效地
进行求解。 计算机软件领域,是一种非常重要并且不可或缺
的算法
.
3
2.1 递归的概念与思想
在思想方法上,递归技术分为:
基于归纳法的递归 把归纳法的思想应用于算法设计中
的某种运算或处理。
例如 a1是问题P(1)的解,若a2=p(a1),则a2是问 题P(2)的解;以此类推,若an-1是问题P(n-1)的 解,且an=p(an-1),则an是问题P(n)的解。
.
5
2.1 递归的概念
用函数自身给出定义的函数称为递归函数。
例1 阶乘函数 阶乘函数可递归地定义为:
n!n(n11)!
n)。 定义其拟逆函数B(n)为:B(n)=min{k|A(k)≥n}。
即B(n)是使n≤A(k)成立的最小的k值。 A(0)=1,A(1)=2,A(2)=4,A(3)=16推知
B(1)=0,B(2)=1,B(3)=B(4)=2和 B(5)=…=B(16)=3。由此可以看出B(n)的增长速度 非常慢。
边界条件 递归方程
第n个Fibonacci数可递归地计算如下:
int fibonacci(int n)
{
if (n <= 1) return 1;
return fibonacci(n-1)+fibonacci(n-2);
}
.
8
2.1 递归的概念
例3 Ackerman函数 当一个函数及它的一个变量是由函数自身定义时,称这个函数 是双递归函数。 Ackerman函数A(n,m)定义如下:
n0 n0
边界条件
递归方程
边界条件与递归方程是递归函数的二个要素,递归函 数只有具备了这两个要素,才能在有限次计算后得出 结果。
.
6
2.1 递归的概念
n阶乘的递归计算如下: Int factorial(int n) {
if(n==0) return 1;
return n*factorial(n-1);
B(n)在复杂度分析中常遇到。A(4)=222…2其中2的 层数为65535,对于通常所见到的正整数n,有 B(n)≤4。但在理论上α(n)没有上界,随着n的增加, 它以难以想象的慢速度趋向正无穷大。
.
12
2.1 递归的概念
例4 排列问题 设计一个递归算法生成n个元素{r1,r2,…,rn}的全排列。
设R={r1,r2,…,rn}是要进行排列的n个元素,Ri=R-{ri}。 集合X中元素的全排列记为perm(X)。 (ri)perm(X)表示在全排列perm(X)的每一个排列前加上 前缀得到的排列。R的全排列可归纳定义如下:
当n=1时,perm(R)=(r),其中r是集合R中唯一的元素; 当n>1时,perm(R)由(r1)perm(R1),(r2)perm(R2),…, (rn)perm(Rn)法如下: void Perm(Type list[],int k,int m)
建立递归方程:
{ if(k==m) { //只剩下1个元素 for(int i=0;i<=m;i++) cout <<list[i];
f(1)n f (n) nf(n1)
cout<<endl; }
}
递归方程为:
f(0)0 f(n) f(n1)1
此类递归方程时间复
杂度为 (n)
.
7
2.1 递归的概念
例2 Fibonacci(斐波那契)数列
无穷数列1,1,2,3,5,8,13,21,34,55,……,称为
Fibonacci数列。它可以递归地定义为:
1
n0
F(n)
1
n1
F(n1)F(n2) n1
A(1,0) 2
A(0,m) 1
m0
A(n,0) n2
n2
A(n,m)A(A(n1,m),m1) n,m1
.
9
2.1 递归的概念
例3 Ackerman函数 前2例中的函数都可以找到相应的非递归方式定义:
n ! 1 2 3 (n 1 )n
F(n)15125n1125n1
本例中的Ackerman函数却无法找到非递归的定义。
基于分治法的递归 把问题划分成一个或多个子问题递归地进行求解
.
4
2.1 递归的概念与思想
对规模为n的问题P(n),归纳法思想: (1) 基础步: a 1是问题P(1)的解 (2)归纳步:对所有的k,1<k<n,若b是问题P(k)的 解,则p(b)是问题P(k+1)的解。其中, p(b)是对b
算法的运行时间:
else //还有多个元素待排列,递归产生排列 for(int i=k;i<=m;i++)
(nn!)
{
Swap(list[k],list[i]);
Perm(list,k+1,m);
Swap(list[k],list[i];
}
}
算法Perm(list,k,m)递归地产生所有前缀是 list[0:k-1],且后 缀是list[k:m]的全排列的所有排列,如果是Perm(list,0,n-1)则 产生list[0:n-1]的全排列。
相关文档
最新文档