第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)循环赛日程表。
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章递归与分治策略
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
• 当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
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课件
递归与分治
递归函数设计
• 阶乘的计算公式
• 换一种思路可以写成
自 底 向 上 计 算 结 果
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
递归函数设计
• 阶乘公式可以写成
• 这其实就是递归的思想,即函数的定义中 使用函数自身的方法 • 除了计算机科学中,还有更多的递归的例 子
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.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.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
如何实现移动圆盘的操作呢?当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))
第2章 递归与分治策略
MOVE(X, 4, Z) HANOI(3, Y, X, Z)
HANOI(2, Y, Z, X) HANOI(1, Y, X, Z) MOVE(Y, 1, Z) MOVE(Y, 2, X) HANOI(1, Z, Y, X) MOVE(Z, 1, X) MOVE(Y, 3, Z)
HANOI(2, X, Y, Z) HANOI(1, X, Z, Y) MOVE(X, 1, Y) MOVE(X, 2, Z) HANOI(1, Y, X, Z) MOVE(Y, 1, Z)
启发式规则:
1. 平衡(balancing)子问题:最好使子问题的规模大致相同。 也就是将一个问题划分成大小相等的k个子问题(通常k=2), 这种使子问题规模大致相等的做法是出自一种平衡 (Balancing)子问题的思想,它几乎总是比子问题规模不等 的做法要好。
2. 独立子问题:各子问题之间相互独立,这涉及到分治法的 效率,如果各子问题不是独立的,则分治法需要重复地解公 共的子问题。
后两种方法在时空复杂度上均有较大改善,但 其适用范围有限。
2.2分治法
分治法的基本思想:
将一个难以直接解决的大问题,划分成一些规模较小 的子问题,以便各个击破,分而治之。更一般地说,将要 求解的原问题划分成k个较小规模的子问题,对这k个子问 题分别求解。如果子问题的规模仍然不够小,则再将每个 子问题划分为k个规模更小的子问题,如此分解下去,直到 问题规模足够小,很容易求出其解为止,再将子问题的解 合并为一个更大规模的问题的解,自底向上逐步求出原问 题的解。
F (n) n! 1 2 3 (n 1) n
例2 Fibonacci(斐波那齐)数列
F(n)
1 5
1
2
5
n1Leabharlann 125n1
HANOI(2, Y, Z, X) HANOI(1, Y, X, Z) MOVE(Y, 1, Z) MOVE(Y, 2, X) HANOI(1, Z, Y, X) MOVE(Z, 1, X) MOVE(Y, 3, Z)
HANOI(2, X, Y, Z) HANOI(1, X, Z, Y) MOVE(X, 1, Y) MOVE(X, 2, Z) HANOI(1, Y, X, Z) MOVE(Y, 1, Z)
启发式规则:
1. 平衡(balancing)子问题:最好使子问题的规模大致相同。 也就是将一个问题划分成大小相等的k个子问题(通常k=2), 这种使子问题规模大致相等的做法是出自一种平衡 (Balancing)子问题的思想,它几乎总是比子问题规模不等 的做法要好。
2. 独立子问题:各子问题之间相互独立,这涉及到分治法的 效率,如果各子问题不是独立的,则分治法需要重复地解公 共的子问题。
后两种方法在时空复杂度上均有较大改善,但 其适用范围有限。
2.2分治法
分治法的基本思想:
将一个难以直接解决的大问题,划分成一些规模较小 的子问题,以便各个击破,分而治之。更一般地说,将要 求解的原问题划分成k个较小规模的子问题,对这k个子问 题分别求解。如果子问题的规模仍然不够小,则再将每个 子问题划分为k个规模更小的子问题,如此分解下去,直到 问题规模足够小,很容易求出其解为止,再将子问题的解 合并为一个更大规模的问题的解,自底向上逐步求出原问 题的解。
F (n) n! 1 2 3 (n 1) n
例2 Fibonacci(斐波那齐)数列
F(n)
1 5
1
2
5
n1Leabharlann 125n1
递归与分治策略讲义课件(ppt 65页)
int prev,now,next,j; if (n<=1) return(1);
else {
prev=1; now=1; for(j=2;j<=n;j++) {
next=prev+now; prev=now; now=next; } return(next); } }
具有编译递归程序能力的程 序设计语言有:C、Pascal 、 ALGOL、 PL/A 、 ADA、 QBASIC等,不具有编译递归 程序能力的程序设计语言有: FORTRAN、 COBOL、BASIC、 低级语言。
Hanio(3,A,B,C) Hanio(2,A,C,B)
Move (A,C)
Hanio(2,B,A,C)
结束
Hanio(2,A,C,B)
Hanio(1,A,B,C) Move (A,B)
Hanio(1,C,A,B)
Hanio(1,A,B,C) Move (A,C)
Hanio(1,C,A,B) Move (C,B)
例3 Hanoi塔问题
设x,y,z是3个塔座。开始时,在塔座x上有一叠共n个圆盘,这 些圆盘自下而上,由大到小地叠在一起。各圆盘从小到大编号 为1,2,…,n,现要求将塔座x上的这一叠圆盘移到塔座z上,并仍 按同样顺序叠置。在移动圆盘时应遵守以下移动规则:
规则1:每次只能移动1个圆盘;
规则2:任何时刻都不允许将较大的圆盘压在较小的圆盘之上;
(1)运行开始时,首先为递归调用建立一个工作栈,其结 构包括值参、局部变量和返回地址;
(2)每次执行递归调用之前,把递归函数的值参和局部变 量的当前值以及调用后的返回地址压栈;
(3)每次递归调用结束后,将栈顶元素出栈,使相应的值 参和局部变量恢复为调用前的值,然后转向返回地址指定 的位置继续执行。
else {
prev=1; now=1; for(j=2;j<=n;j++) {
next=prev+now; prev=now; now=next; } return(next); } }
具有编译递归程序能力的程 序设计语言有:C、Pascal 、 ALGOL、 PL/A 、 ADA、 QBASIC等,不具有编译递归 程序能力的程序设计语言有: FORTRAN、 COBOL、BASIC、 低级语言。
Hanio(3,A,B,C) Hanio(2,A,C,B)
Move (A,C)
Hanio(2,B,A,C)
结束
Hanio(2,A,C,B)
Hanio(1,A,B,C) Move (A,B)
Hanio(1,C,A,B)
Hanio(1,A,B,C) Move (A,C)
Hanio(1,C,A,B) Move (C,B)
例3 Hanoi塔问题
设x,y,z是3个塔座。开始时,在塔座x上有一叠共n个圆盘,这 些圆盘自下而上,由大到小地叠在一起。各圆盘从小到大编号 为1,2,…,n,现要求将塔座x上的这一叠圆盘移到塔座z上,并仍 按同样顺序叠置。在移动圆盘时应遵守以下移动规则:
规则1:每次只能移动1个圆盘;
规则2:任何时刻都不允许将较大的圆盘压在较小的圆盘之上;
(1)运行开始时,首先为递归调用建立一个工作栈,其结 构包括值参、局部变量和返回地址;
(2)每次执行递归调用之前,把递归函数的值参和局部变 量的当前值以及调用后的返回地址压栈;
(3)每次递归调用结束后,将栈顶元素出栈,使相应的值 参和局部变量恢复为调用前的值,然后转向返回地址指定 的位置继续执行。
递归与分治PPT课件
递归元
2021/5/21
• 递归算法的思想是将对较大规模的对象的操 作归结为对较小规模的对象实施同样的操作。
• 这种规模的变化就体现在递归算法的变元中 的一类(一个或几个)变元上,这类变元被称 之为递归元。
• 递归元的变化是在递归定义中确定的,它的 变化应能导致递归算法的终止。
• 在递归算法的设计中递归元是非常重要的。
不大于m的划分个数记为q(n, m),可以建立
如的q(下n二,的元m递)递{归归关函1 系数::
n=1或
• 最m简i=f (单1n 情< 1形) :|| ((m1)<q1(n) , 1)r=e1t,uqrn(10,;m) =1 n, q(inf,(nm=) = 1)1|+| (qm(n=,=n–11) )return 1; n ≤ m m≥i1f ;(n == 1)q|(|n(,nm<–m1))+q(rne–tumr,nm1) +nq>(nm, >n–11);
一6,个5+划1分, 4。+2正, 4整+1数+n1的, 3不+同3, 的3+划2+分1的, 个
3数+成1+为1+正1 整数n的划分数,记作ρ(n)。
2+2+2, 2+2+1+1, 2+1+1+1+1,
2021/5/21
1+1+1+1+1+1
5
第5页/共57页
正整数的划分
• 在正整数的所有不同划分中,将最大加数n1
2021/5/21
若~为除法,即n / b,则有:
T(n) = aT(n / b) + D(n)
2021/5/21
• 递归算法的思想是将对较大规模的对象的操 作归结为对较小规模的对象实施同样的操作。
• 这种规模的变化就体现在递归算法的变元中 的一类(一个或几个)变元上,这类变元被称 之为递归元。
• 递归元的变化是在递归定义中确定的,它的 变化应能导致递归算法的终止。
• 在递归算法的设计中递归元是非常重要的。
不大于m的划分个数记为q(n, m),可以建立
如的q(下n二,的元m递)递{归归关函1 系数::
n=1或
• 最m简i=f (单1n 情< 1形) :|| ((m1)<q1(n) , 1)r=e1t,uqrn(10,;m) =1 n, q(inf,(nm=) = 1)1|+| (qm(n=,=n–11) )return 1; n ≤ m m≥i1f ;(n == 1)q|(|n(,nm<–m1))+q(rne–tumr,nm1) +nq>(nm, >n–11);
一6,个5+划1分, 4。+2正, 4整+1数+n1的, 3不+同3, 的3+划2+分1的, 个
3数+成1+为1+正1 整数n的划分数,记作ρ(n)。
2+2+2, 2+2+1+1, 2+1+1+1+1,
2021/5/21
1+1+1+1+1+1
5
第5页/共57页
正整数的划分
• 在正整数的所有不同划分中,将最大加数n1
2021/5/21
若~为除法,即n / b,则有:
T(n) = aT(n / b) + D(n)
《计算机算法设计与分析》第二章 递归与分治策略PPT课件
{
if (n <= 1) return 1;
return fibonacci(n-1)+fibonacci(n-2);
} 2020/7/31
10
例3 Ackerman函数 当一个函数及它的一个变量是由函数自身定义时,称这
个函数是双递归函数。 Ackerman函数A(n,m)定义如下:
A(1,0) 2
12
例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 。
第2章 递归与分治策略
2020/7/31
1
第一部分
整体概述
THE FIRST PART OF THE OVERALL OVERVIEW, PLEASE SUMMARIZE THE CONTENT
2
学习要点:
理解递归的概念。 掌握设计有效算法的分治策略。 通过下面的范例学习分治策略设计技巧。
当n=1时,perm(R)=(r),其中r是集合R中唯一的元素; 当n>1时,perm(R)由(r1)perm(R1),(r2)perm(R2),…, (rn)perm(Rn)构成。
T(nn/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
new_第2章_递归与分治策略
递归举例
• 在以下三种情况下,常常要用到递归的方法。 • 1. 定义是递归的:有许多数学公式、数列等的定义是递归的。例如, 求n!和Fibonacci数列等。这些问题的求解过程可以将其递归定义直 接转化为对应的递归算法。
递归举例
• 2. 数据结构是递归的:有些数据结构是递归的。例如, 单链表就是一 种递归数据结构,其结点类型定义如下,该定义中,结构体LNode的定 义中用到了它自身,即指针域next是一种指向自身类型的指针,所以它 是一种递归数据结构。
分治法的概念
• 举例:有一个老板有一袋金块。每个月将有两名雇员会因其优异的表 现分别被奖励一个金块。按规矩,排名第一的雇员将得到袋中最重的 金块,排名第二的雇员将得到袋中最轻的金块。根据这种方式,除非 有新的金块加入袋中,否则第一名雇员所得到的金块总是比第二名雇 员所得到的金块重。因为有新的金块周期性的加入袋中,所以每个月 都必须找出最轻和最重的金块。假设有一台比较重量的仪器,我们希 望用最少的比较次数找出最轻和最重的金块。 • 解:如果采用先比较其中两个金块,再拿其中重的和袋中剩下的依次 比较,则需要n-1次轻的金块,则共需比较2n-3次。本问题可转化为求最 大数、最小数问题。
分治法的概念
• 举例:有一个老板有一袋金块。每个月将有两名雇员会因其优异的表 现分别被奖励一个金块。按规矩,排名第一的雇员将得到袋中最重的 金块,排名第二的雇员将得到袋中最轻的金块。根据这种方式,除非 有新的金块加入袋中,否则第一名雇员所得到的金块总是比第二名雇 员所得到的金块重。因为有新的金块周期性的加入袋中,所以每个月 都必须找出最轻和最重的金块。假设有一台比较重量的仪器,我们希 望用最少的比较次数找出最轻和最重的金块。
递归与堆栈
• 程序的主要执行过程: • (5)CPU回到 cs:000EH处(即call指令后面的指令处)继续 执行。
第2章递归与分治策略PPT课件
3
算法总体思想
将要求解的较大规模的问题分割成k个更小规模的子问题。 对这k个子问题分别求解。如果子问题的规模仍然不够小,则
再划分为k个子问题,如此递归的进行下去,直到问题规模足 够小,很容易求出其解为止。
4
算法总体思想
将求出的小规模的问题的解合并为一个更大规模的问 题的解,自底向上逐步求出原来问题的解。
A(1,0)2
A(0,m)1
m0
A(n,0)n2
n2
A(n,m)A(A(n1,m),m1) n,m1
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),和
A(1,2)=A(A(0,2),1)=A(1,1)=2,故A(n,2)= 2^n 。
22 2 2
M=3时,类似的可以推出 n
M=4时,A(n,4)的增长速度非常快,以至于没有适源自当的数学式子来表示这一函数。
11
2.1 递归的概念
例4 排列问题 设计一个递归算法生成n个元素{r1,r2,…,rn}的全排列。 设R={r1,r2,…,rn}是要进行排列的n个元素,Ri=R-{ri}。 集合X中元素的全排列记为perm(X)。 (ri)perm(X)表示在全排列perm(X)的每一个排列前加上前 缀得到的排列。R的全排列可归纳定义如下:
(1) q(n,1)=1,n1; 当即最n大1 加 1 数n n 11不大于1时,任何正整数n只有一种划分形式,
算法总体思想
将要求解的较大规模的问题分割成k个更小规模的子问题。 对这k个子问题分别求解。如果子问题的规模仍然不够小,则
再划分为k个子问题,如此递归的进行下去,直到问题规模足 够小,很容易求出其解为止。
4
算法总体思想
将求出的小规模的问题的解合并为一个更大规模的问 题的解,自底向上逐步求出原来问题的解。
A(1,0)2
A(0,m)1
m0
A(n,0)n2
n2
A(n,m)A(A(n1,m),m1) n,m1
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),和
A(1,2)=A(A(0,2),1)=A(1,1)=2,故A(n,2)= 2^n 。
22 2 2
M=3时,类似的可以推出 n
M=4时,A(n,4)的增长速度非常快,以至于没有适源自当的数学式子来表示这一函数。
11
2.1 递归的概念
例4 排列问题 设计一个递归算法生成n个元素{r1,r2,…,rn}的全排列。 设R={r1,r2,…,rn}是要进行排列的n个元素,Ri=R-{ri}。 集合X中元素的全排列记为perm(X)。 (ri)perm(X)表示在全排列perm(X)的每一个排列前加上前 缀得到的排列。R的全排列可归纳定义如下:
(1) q(n,1)=1,n1; 当即最n大1 加 1 数n n 11不大于1时,任何正整数n只有一种划分形式,
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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]的全排列。
作业
.
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]的全排列。