第2章 递归与分治策略(0-算法思想)

合集下载

递归与分治策略计算机算法设计与分析第3版

递归与分治策略计算机算法设计与分析第3版
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 。
M=3时,类似的可以推出
Байду номын сангаас
222 2
M=4时,A(n,4)的增长速度非常快n,以至于没有适当的数学式
子来表示这一函数。
2.1 递归的概念
A(0, m) 1
A(n,0) n 2
m0 n2
A(n, m) A( A(n 1, m),m 1) n, m 1
2.1 递归的概念
例3 Ackerman函数 前2例中的函数都可以找到相应的非递归方式定义:
n! 1 2 3 (n 1) n
F(n)
1 5
1
2
n1
5
1
2
第2章 递归与分治策略
学习要点: 理解递归的概念。 掌握设计有效算法的分治策略。 通过下面的范例学习分治策略设计技巧。 (1)二分搜索技术; (2)大整数乘法; (3)Strassen矩阵乘法; (4)棋盘覆盖; (5)合并排序和快速排序; (6)线性时间选择; (7)最接近点对问题; (8)循环赛日程表。
分治与递归像一对孪生兄弟,经常同时应用在 算法设计之中,并由此产生许多高效算法。
下面来看几个实例。
2.1 递归的概念
例1 阶乘函数 阶乘函数可递归地定义为:
1 n0 n! n(n 1)! n 0
边界条件 递归方程
边界条件与递归方程是递归函数的二个要素,递归函 数只有具备了这两个要素,才能在有限次计算后得出 结果。
{
if (n <= 1) return 1;
return fibonacci(n-1)+fibonacci(n-2);

算法之2章递归与分治

算法之2章递归与分治

算法分析(第二章):递归与分治法一、递归的概念知识再现:等比数列求和公式:1、定义:直接或间接地调用自身的算法称为递归算法。

用函数自身给出定义的函数称为递归函数。

2、与分治法的关系:由分治法产生的子问题往往是原问题的较小模式,这就为使用递归技术提供了方便。

在这种情况下,反复应用分治手段,可以使子问题与原问题类型一致而其规模却不断缩小,最终使子问题缩小到很容易直接求出其解。

这自然导致递归过程的产生。

分治与递归经常同时应用在算法设计之中,并由此产生许多高效算法。

3、递推方程:(1)定义:设序列01,....na a a简记为{na},把n a与某些个()ia i n<联系起来的等式叫做关于该序列的递推方程。

(2)求解:给定关于序列{n a}的递推方程和若干初值,计算n a。

4、应用:阶乘函数、Fibonacci数列、Hanoi塔问题、插入排序5、优缺点:优点:结构清晰,可读性强,而且容易用数学归纳法来证明算法的正确性,因此它为设计算法、调试程序带来很大方便。

缺点:递归算法的运行效率较低,无论是耗费的计算时间还是占用的存储空间都比非递归算法要多。

二、递归算法改进:1、迭代法:(1)不断用递推方程的右部替代左部(2)每一次替换,随着n的降低在和式中多出一项(3)直到出现初值以后停止迭代(4)将初值代入并对和式求和(5)可用数学归纳法验证解的正确性2、举例:-----------Hanoi塔算法----------- ---------------插入排序算法----------- ()2(1)1(1)1T n T nT=−+=()(1)1W n W n nW=−+−(1)=021n-23()2(1)12[2(2)1]12(2)21...2++2 (121)n n n T n T n T n T n T −−=−+=−++=−++==++=−(1)2 ()(1)1((n-2)+11)1(2)(2)(1)...(1)12...(2)(1)(1)/2W n W n n W n n W n n n W n n n n =−+−=−−+−=−+−+−==++++−+−=−3、换元迭代:(1)将对n 的递推式换成对其他变元k 的递推式 (2)对k 进行迭代(3)将解(关于k 的函数)转换成关于n 的函数4、举例:---------------二分归并排序---------------()2(/2)1W n W n n W =+−(1)=0(1)换元:假设2kn =,递推方程如下()2(/2)1W n W n n W =+−(1)=0 → 1(2)2(2)21k k k W W W−=+−(0)=0(2)迭代求解:12122222321332133212()2(2)212(2(2)21)212(2)22212(2)2*2212(2(2)21)2212(2)222212(2)3*2221...2(0)*2(22...21)22k k k k k k k k k k k k k k k k k k k k k k k k W n W W W W W W W W k k −−−−−−−+−+−−−=+−=+−+−=+−+−=+−−=+−+−−=+−+−−=+−−−==+−++++=−1log 1n n n +=−+(3)解的正确性—归纳验证: 证明递推方程的解是()(1)/2W n n n =−()(1)1W n W n n W =−+−(1)=0,(n 1)=n +n=n(n-1)/2+n =n[(n-1)/2+1]=n(n+1)/2n W W +方法:数学归纳法证 n=1,W(1)=1*(1-1)/2=0假设对于解满足方程,则()---------------快速排序--------------------->>>平均工作量:假设首元素排好序在每个位置是等概率的112()()()(1)0n i T n T i O n n T −==+=∑ >>>对于高阶方程应该先化简,然后迭代(1)差消化简:利用两个方程相减,将右边的项尽可能消去,以达到降阶的目的。

《算法设计与分析》(全)

《算法设计与分析》(全)
巢湖学院计算机科学与技术系
1.1、算法与程序
程序:是算法用某种程序设计语言的具体实现。 程序可以不满足算法的性质(4)。 例如操作系统,是一个在无限循环中执行的程序, 因而不是一个算法。 操作系统的各种任务可看成是单独的问题,每一个 问题由操作系统中的一个子程序通过特定的算法来实 现。该子程序得到输出结果后便终止。
渐近分析记号的若干性质
(1)传递性: ➢ f(n)= (g(n)), g(n)= (h(n)) f(n)= (h(n)); ➢ f(n)= O(g(n)), g(n)= O (h(n)) f(n)= O (h(n)); ➢ f(n)= (g(n)), g(n)= (h(n)) f(n)= (h(n)); ➢ f(n)= o(g(n)), g(n)= o(h(n)) f(n)= o(h(n)); ➢ f(n)= (g(n)), g(n)= (h(n)) f(n)= (h(n)); (2)反身性: ➢ f(n)= (f(n));f(n)= O(f(n));f(n)= (f(n)). (3)对称性: ➢ f(n)= (g(n)) g(n)= (f(n)) . (4)互对称性: ➢ f(n)= O(g(n)) g(n)= (f(n)) ; ➢ f(n)= o(g(n)) g(n)= (f(n)) ;
巢湖学院计算机科学与技术系
渐近分析记号的若干性质
规则O(f(n))+O(g(n)) = O(max{f(n),g(n)}) 的证明: ➢ 对于任意f1(n) O(f(n)) ,存在正常数c1和自然数n1,使得对
所有n n1,有f1(n) c1f(n) 。 ➢ 类似地,对于任意g1(n) O(g(n)) ,存在正常数c2和自然数
巢湖学院计算机科学与技术系
第1章 算法引论

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

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

“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
初始条件与递归方程是递归函数的二个要素

第二章递归与分治

第二章递归与分治
2019/3/24 计算机算法设计与分析 7
正整数的划分





在正整数的所有不同划分中,将最大加数n1不 大于m的划分个数记为q(n, m),可以建立如下 的递归关系: 的二元递归函数: n= 1 n, 或m m =1 q (n, m) { 1 (1) q(n, 1)=1, q(1, m) 最简单情形: =1 ≥1; q(n, m) = 1 + q(n, n –1) n ≤ m if (n < 1) || (m < 1) return 0; 递归关系: (2) q(n, n) = 1 + q(n, n–1),n>1; q(n, m– 1)+q(n –m, m) if (n == 1) || (m == 1) return 1; n>m>1 产生的新情况: if (n == 1) || (n < m) return 1 + q(n, n–1); return q(n, m –1) q(n m, } n>m>1 (3) q(n, m) =q (n, m+ –1) +–q (nm); –m, m), (4) q(n, m) = q(n, n),=n < mn) 。 整数 n的划分数 ρ(n) q (n, 。

2019/3/24 计算机算法设计与分析 3
Hanoi塔问题
例 Hanoi 1:Hanoi 塔的解可以很自然地看成这样一个过程: 塔问题:有A、B、C三根柱子。A
上有n个圆盘,自下而上由大到小地叠在一起。 于是可得到如下的程序: (1)先将A上面 现要将 A上的全部圆 n –1 个盘移至 C。 void Hanoi(int n, int Fr, int To, int As) { 盘移到B上,并要求: if (n > 0) { (2)再将 A上剩下 (1)每次只能移动一个 Hanoi(n–1, Fro, Ass, To); 的1 个盘移至 B。 圆盘; (2)任何时刻都 B C A Move(Fro, To); 不允许将较大的圆盘 Hanoi(n–1, Ass, To, Fro)} (3) 最后将C上的 压在较小的圆盘上; } n–(3) 1个盘移至 B。A、B、 圆盘只能在 C三个柱子间移动。

c02 递归与分治策略分解

c02 递归与分治策略分解

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
算法总体思想
将求出的小规模的问题的解合并为一个更大规 模的问题的解,自底向上逐步求出原来问题的 解。
{ if (n <= 1) return 1; return fibonacci(n-1)+fibonacci(n-2);
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)二分搜索技术; (2)大整数乘法; 3)Strassen矩阵乘法; 4)棋盘覆盖; 5)合并排序和快速排序; 6)线性时间选择; (7)最接近点对问题; (8)循环赛日程表。
算法总体思想
2.1 递归的概念
直接或间接地调用自身的算法称为递归算法。 用函数自身给出定义的函数称为递归函数。
由分治法产生的子问题是原问题的较小模式, 为使用递归技术提供了方便。反复应用分治 手段,使子问题与原问题类型一致而其规模 却不断缩小,最终使子问题缩小到很容易直 接求出其解。这自然导致递归过程的产生。

算法之2章递归与分治

算法之2章递归与分治

算法分析(第二章):递归与分治法一、递归的概念知识再现:等比数列求和公式:1、定义:直接或间接地调用自身的算法称为递归算法。

用函数自身给出定义的函数称为递归函数。

2、与分治法的关系:由分治法产生的子问题往往是原问题的较小模式,这就为使用递归技术提供了方便。

在这种情况下,反复应用分治手段,可以使子问题与原问题类型一致而其规模却不断缩小,最终使子问题缩小到很容易直接求出其解。

这自然导致递归过程的产生。

分治与递归经常同时应用在算法设计之中,并由此产生许多高效算法。

3、递推方程:(1)定义:设序列01,....na a a简记为{na},把n a与某些个()ia i n<联系起来的等式叫做关于该序列的递推方程。

(2)求解:给定关于序列{n a}的递推方程和若干初值,计算n a。

4、应用:阶乘函数、Fibonacci数列、Hanoi塔问题、插入排序5、优缺点:优点:结构清晰,可读性强,而且容易用数学归纳法来证明算法的正确性,因此它为设计算法、调试程序带来很大方便。

缺点:递归算法的运行效率较低,无论是耗费的计算时间还是占用的存储空间都比非递归算法要多。

二、递归算法改进:1、迭代法:(1)不断用递推方程的右部替代左部(2)每一次替换,随着n的降低在和式中多出一项(3)直到出现初值以后停止迭代(4)将初值代入并对和式求和(5)可用数学归纳法验证解的正确性2、举例:-----------Hanoi塔算法----------- ---------------插入排序算法----------- ()2(1)1(1)1T n T nT=−+=()(1)1W n W n nW=−+−(1)=021n-23()2(1)12[2(2)1]12(2)21...2++2 (121)n n n T n T n T n T n T −−=−+=−++=−++==++=−(1)2 ()(1)1((n-2)+11)1(2)(2)(1)...(1)12...(2)(1)(1)/2W n W n n W n n W n n n W n n n n =−+−=−−+−=−+−+−==++++−+−=−3、换元迭代:(1)将对n 的递推式换成对其他变元k 的递推式 (2)对k 进行迭代(3)将解(关于k 的函数)转换成关于n 的函数4、举例:---------------二分归并排序---------------()2(/2)1W n W n n W =+−(1)=0(1)换元:假设2kn =,递推方程如下()2(/2)1W n W n n W =+−(1)=0 → 1(2)2(2)21k k k W W W−=+−(0)=0(2)迭代求解:12122222321332133212()2(2)212(2(2)21)212(2)22212(2)2*2212(2(2)21)2212(2)222212(2)3*2221...2(0)*2(22...21)22k k k k k k k k k k k k k k k k k k k k k k k k W n W W W W W W W W k k −−−−−−−+−+−−−=+−=+−+−=+−+−=+−−=+−+−−=+−+−−=+−−−==+−++++=−1log 1n n n +=−+(3)解的正确性—归纳验证: 证明递推方程的解是()(1)/2W n n n =−()(1)1W n W n n W =−+−(1)=0,(n 1)=n +n=n(n-1)/2+n =n[(n-1)/2+1]=n(n+1)/2n W W +方法:数学归纳法证 n=1,W(1)=1*(1-1)/2=0假设对于解满足方程,则()---------------快速排序--------------------->>>平均工作量:假设首元素排好序在每个位置是等概率的112()()()(1)0n i T n T i O n n T −==+=∑ >>>对于高阶方程应该先化简,然后迭代(1)差消化简:利用两个方程相减,将右边的项尽可能消去,以达到降阶的目的。

大学_计算机算法设计与分析第4版(王晓东著)课后答案下载

大学_计算机算法设计与分析第4版(王晓东著)课后答案下载

计算机算法设计与分析第4版(王晓东著)课后答
案下载
计算机算法设计与分析第4版内容简介
第1章算法概述
1.1 算法与程序
1.2 算法复杂性分析
1.3 NP完全性理论
算法分析题1
算法实现题1
第2章递归与分治策略
2.1 递归的概念
2.2 分治法的基本思想
2.3 二分搜索技术
2.4 大整数的乘法
2.5 Strassen矩阵乘法
2.6 棋盘覆盖
2.7 合并排序
2.8 快速排序
2.9 线性时间选择
2.10 最接近点对问题
第3章动态规划
第4章贪心算法
第5章回溯法
第6章分支限界法
第7章随机化算法
第8章线性规划与网络流
附录A C++概要
参考文献
计算机算法设计与分析第4版目录
本书是普通高等教育“十一五”__规划教材和国家精品课程教材。

全书以算法设计策略为知识单元,系统介绍计算机算法的设计方法与分析技巧。

主要内容包括:算法概述、递归与分治策略、动态规划、贪心算法、回溯法、分支限界法、__化算法、线性规划与网络流等。

书中既涉及经典与实用算法及实例分析,又包括算法热点领域追踪。

为突出教材的`可读性和可用性,章首增加了学习要点提示,章末配有难易适度的算法分析题和算法实现题;配套出版了《计算机算法设计与分析习题解答(第2版)》;并免费提供电子课件和教学服务。

[理学]算法设计与分析课件 第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

第二章递归与分治策略

第二章递归与分治策略

例: Fibonacci数列
1
n 0,1
F(n)= F(n 1) F(n 2) n 1
求第n个Fibonacci数的算法描述
public static int fibonacci(int n)
{
if(n<=1)return 1;
return fibonacci(n-1)+fibonacci(n-2);
}
注: 1. perm(list,k,m)产生前缀是list[0:k-1],后缀是list[k:m]的全 排序的所有排序。
2.调用perm(list,0,n-1)产生list[0:n-1]的全排序
3. 算法将list[k:m]中每一个元素分别与list[k]中的元素交换, 递归产生list[k+1:m]的全排序,结果为list[0:k]的后缀。
例 Hanoi塔 a,b,c三个塔,a中有n个圆盘(由小到大叠放),从小到大编
号为1,2,…,n 要求:将塔a上的盘移到塔c上,按原顺序叠放 规则:(1)每次只移一个圆盘
(2)不允许大盘压在小盘上 public static void hanoi(int n,int a,int b,int c) {
2.1 递归的概念
❖ 递归调用:直接或间接地调用自身的算法。
❖ 递归函数:用函数自身给出定义的函数。
❖ 递归的优缺点:
优点:易于实现,便于分析。
不足:占用空间较多,在某些设计中可能 会导致重复计算。
❖ 递归调用的一般条件:一般问题本身应具有递 归特性,应具备递归结束的条件。
例:阶乘函数
1 n0
}
例 :排列问题
R={r1,r2,···,rn}进行排列
Ri=R-{ri} perm(X)表示集合X的全排序,(ri)perm(X)是X全排序前加

算法第二章递归与分治策略小结

算法第二章递归与分治策略小结

算法第⼆章递归与分治策略⼩结第2章递归与分治策略2.1.递归的概念递归算法:直接或间接地调⽤⾃⾝的算法递归函数:⽤函数⾃⾝给出定义的函数递归函数的第⼀句⼀定是if语句作为边界条件,然后就是递归⽅程如:阶乘函数的第⼀句就是if条件语句1int factorial(int n){2if( n ==0)3return1;4return n*factorial(n-1);5 }※※※递归函数中⽐较著名的是Hanoi塔问题Hanoi塔问题。

设a,b,c是3个塔座。

开始时,在塔座a上有⼀叠共n个圆盘,这些圆盘⾃下⽽上,由⼤到⼩地叠在⼀起。

各圆盘从⼩到⼤编号为1,2,…,n,现要求将塔座a上的这⼀叠圆盘移到塔座c上,并仍按同样顺序叠置。

在移动圆盘时应遵守以下移动规则:规则1:每次只能移动1个圆盘;规则2:任何时刻都不允许将较⼤的圆盘压在较⼩的圆盘之上;规则3:在满⾜规则1和2的前提下,可将圆盘移⾄a,b,c中任⼀塔座上。

hanoi塔问题题⽬描述1 #include<iostream>2using namespace std;3void move(char p1,char p2){4 cout<<p1<<"->"<<p2<<endl;5 }67//将a上的n个盘⼦经b移动到c上8void hanoi(int n,char a,char b,char c){9if(n == 0) return;//当a上没有盘⼦的时候,直接返回不需要移动10if(n == 1) move(a,c);//当a上只有⼀个盘⼦的时候,直接将盘⼦从a上移动到c上11if(n>1){12 hanoi(n-1,a,c,b);13 move(a,b);14 hanoi(n-1,c,b,a);15 }16 }1718int main(){19char x,y,z;20 x = 'a';21 y = 'b';22 z = 'c';23 hanoi(4,x,y,z);24return0;25 }Hanoi塔2.2分治法的基本思想分治法的基本思想:将⼀个规模为n的问题分解为k个规模较⼩的⼦问题,这些⼦问题相互独⽴且与原问题相同在使⽤分治法设计算法的时候,最好使⼦问题的规模⼤致相同,即将⼀个问题分为⼤⼩相等的k个⼦问题,⼀般情况k取2.※※※分治法中⽐较著名的是划分整数问题1、整数划分问题将⼀个正整数n表⽰为⼀系列正整数之和,n = n1 + n2 +…+nk其中n1≥n2≥…≥nk≥1, k≥1。

递归与分治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.递归和分治法的定义
2.递归和分治法的区别
3.递归和分治法的应用
4.递归和分治法的优缺点
正文
一、递归和分治法的定义
递归法是一种编程方法,指的是在一个函数中调用自身来解决问题。

递归法将原问题分解成规模较小的相似子问题,通过解决子问题来最终解决原问题。

分治法则是一种解决问题的策略,将原问题拆分成若干个相互独立的子问题,然后分别解决这些子问题,最后将子问题的解合并得到原问题的解。

二、递归和分治法的区别
递归法和分治法在解决问题时都采用了“分而治之”的思想,但它们之间存在一定的区别:
1.递归法是函数自身调用自己,而分治法是通过不同的函数来解决子问题。

2.递归法的子问题解决过程与原问题相似,而分治法的子问题相对独立。

3.递归法通常需要较多的函数调用,可能导致栈溢出,而分治法通过将问题分解成相互独立的子问题,可以更有效地解决问题。

三、递归和分治法的应用
递归法和分治法在实际编程中都有广泛的应用,如:
1.递归法:计算阶乘、汉诺塔问题、斐波那契数列等。

2.分治法:快速排序、归并排序、大整数乘法等。

四、递归和分治法的优缺点
1.递归法的优点:代码简洁,易于理解;缺点:可能导致栈溢出,效率较低。

2.分治法的优点:效率较高,可避免栈溢出;缺点:代码较为复杂,需要编写多个子函数。

《计算机算法设计与分析》第二章 递归与分治策略PPT课件

《计算机算法设计与分析》第二章 递归与分治策略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章_递归与分治策略

new_第2章_递归与分治策略

递归举例
• 在以下三种情况下,常常要用到递归的方法。 • 1. 定义是递归的:有许多数学公式、数列等的定义是递归的。例如, 求n!和Fibonacci数列等。这些问题的求解过程可以将其递归定义直 接转化为对应的递归算法。
递归举例
• 2. 数据结构是递归的:有些数据结构是递归的。例如, 单链表就是一 种递归数据结构,其结点类型定义如下,该定义中,结构体LNode的定 义中用到了它自身,即指针域next是一种指向自身类型的指针,所以它 是一种递归数据结构。
分治法的概念
• 举例:有一个老板有一袋金块。每个月将有两名雇员会因其优异的表 现分别被奖励一个金块。按规矩,排名第一的雇员将得到袋中最重的 金块,排名第二的雇员将得到袋中最轻的金块。根据这种方式,除非 有新的金块加入袋中,否则第一名雇员所得到的金块总是比第二名雇 员所得到的金块重。因为有新的金块周期性的加入袋中,所以每个月 都必须找出最轻和最重的金块。假设有一台比较重量的仪器,我们希 望用最少的比较次数找出最轻和最重的金块。 • 解:如果采用先比较其中两个金块,再拿其中重的和袋中剩下的依次 比较,则需要n-1次轻的金块,则共需比较2n-3次。本问题可转化为求最 大数、最小数问题。
分治法的概念
• 举例:有一个老板有一袋金块。每个月将有两名雇员会因其优异的表 现分别被奖励一个金块。按规矩,排名第一的雇员将得到袋中最重的 金块,排名第二的雇员将得到袋中最轻的金块。根据这种方式,除非 有新的金块加入袋中,否则第一名雇员所得到的金块总是比第二名雇 员所得到的金块重。因为有新的金块周期性的加入袋中,所以每个月 都必须找出最轻和最重的金块。假设有一台比较重量的仪器,我们希 望用最少的比较次数找出最轻和最重的金块。
递归与堆栈
• 程序的主要执行过程: • (5)CPU回到 cs:000EH处(即call指令后面的指令处)继续 执行。

第2章_递归与分治策略

第2章_递归与分治策略

• 分析:完成Hanoi(3,a,c,b)的工完作成可! 以分解成如
下三个步骤:Hanoi(2,a,b,c)、MOVE(a,3,b)和
Hanoi(2,c,a,b)。
2019/9/10
算法设计与分析
23
总结:三阶Hanoi塔问题
1 2 3
塔座a
塔座b
塔座c
• 将一个复杂的问题(三阶Hanoi塔问题)归结为若干个较简
• 分析:完成Hanoi(3,a,c,b)的工作可以分解成如下 三个步骤:Hanoi(2,a,b,c)、MOVE(a,3,b)和 Hanoi(2,c,a,b)。
2019/9/10
算法设计与分析
21
需要先完成:Hanoi(2,a,b,c);
三阶Ha该n工oi作塔又问可题分解成:① Hanoi(1,a,c,b);②
单的问题(二阶Hanoi塔问题);
• 然后将这些较简单的每一个问题(二阶Hanoi塔问题)再归 结为更简单的问题,直到最简单的问题(一阶Hanoi塔问题)
为止。
2019/9/10
算法设计与分析
24
再分析:n阶Hanoi塔问题
• 求解的步骤: 1. 如果n=1,则可直接将这一个圆盘移动到目的柱
上,过程结束。如果n>1,则进行步骤2。

An,0 n 2
An, m AAn 1, m, m 1
m0 n2 n, m 1
2019/9/10
算法设计与分析
8
分析
• A(n,m)的自变量m的每一个值都定义了一个单 变量函数:
• m=0时,A(n,0)=n+2。
• m=1时,A(n,1)=2n。
for(int i=k;i<=m;i++) {

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

第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只有一种划分形式,

第2章递归与分治法

第2章递归与分治法

分治法的设计思想是,将一个难以直接解决的大问题, n = T(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 5
6
实现这种递归调用的关键是为 过程建立递归调用工作栈。通常, 在一个过程中调用另一过程时,系 统需在运行被调用过程之前先完成3
件事:
7
(1)将所有实参指针,返回地址等信
息传递给被调用过程;
(2)为被调用过程的局部变量分配存 储区;
(3)将控制转移到被调用过程的入
口。
8
在从被调用过程返回调用过程
20
例1:二分搜索技术
给定已按升序排好序的n个元素a[0:n-1],现要在这n个元素中 找出一特定元素x。 分析: 该问题的规模缩小到一定的程度就可以容易地解决; 该问题可以分解为若干个规模较小的相同问题; 分解出的子问题的解可以合并为原问题的解; 分解出的各个子问题是相互独立的。
16
|P|表示问题P的规模。 N0为一阈值,表示当问题P 的规模不超过n0时,
问题已容易直接解出,不必再继续分解。
ADHOC(P)是该分治法中的基本子算法,用于 直接解小规模的问题P。 算法MERGE(yl,…,yk,y)是该分治法中的 合并子算法
17
实践表明:
在用分治法设计算法时,最好使子问
T(n)
n/2
=
n/2
n
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 4

计算机算法设计与分析-递归与分治

计算机算法设计与分析-递归与分治
通常,递归元的递减方式~有两种: 1、减法,即n – b,的形式 2、除法,即n / b,的形式
2023/10/8
计算机算法设计与分析
7
一、递减方式为减法
若~为减法,即n – b,则有:
T(n) = aT(n – b) + D(n)
= a(aT(n – 2b) + D(n – b)) + D(n) =
当a = D(b)时 当a > D(b)时
2023/10/8
计算机算法设计与分析
13
求解递归方程
考虑下列递归方程:T(1) = 1 ⑴T(n) = 4T(n/2) +n ⑵ T(n) = 4T(n/2) +n2 ⑶ T(n) = 4T(n/2) +n3
解:方程中均为a = 4,b = 2,其齐次解为n2。 对⑴, ∵ a > b1 (D(n) = n) ∴ T(n) = O(n2); 对⑵, ∵ a = b2 (D(n) = n2) ∴ T(n) = O(n2logn); 对⑶, ∵ a < b3 (D(n) = n3) ∴ T(n) = O(n3);
{p=0; /*p用于记录每次的进位值*/ for (j=0;j<m;j++)
{q=c[i+j]+a[j]*b[i]+p; c[i+j]=q%10; p=q/10; } c[i+m]=p; if (c[m+n-1]==0) k - -; /*乘积只有m+n-1位*/ return(k); /*以乘积的位数作为函数返回值*/ }
在递归算法的设计中递归元是非常重要的。
2023/10/8
计算机算法设计与分析
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

等角螺曲线 = Fibonacci正方形积木 +1/4圆周
2.1 递归的概念
例2 Fibonacci数列 2,鹦鹉螺:等角螺曲线,向径和切线的夹角永远不变的曲线
2.1 递归的概念
例3 Ackerman函数 当一个函数及它的一个变量是由函数自身定义时,称这个函数 是双递归函数。 Ackerman函数A(n,m)定义如下:
1 n0 F ( n) 1 n 1 F (n 1) F (n 2) n 1
边界条件
递归方程
第n个Fibonacci数可递归地计算如下: int fibonacci(int n) T(1) = O(1) { T(n) = T(n-1)+T(n-2)+O(1) if (n <= 1) return 1; return fibonacci(n-1)+fibonacci(n-2); 解得:T(n) = O((3/2)^n) }
下面来看几个实例。


2.1 递归的概念
例1 阶乘函数 阶乘函数可递归地定义为: 边界条件
n0 1 n! n(n 1)! n 0
递归方程
边界条件与递归方程是递归函数的二个要素,递归函数只 有具备了这两个要素,才能在有限次计算后得出结果。
2.1 递归的概念
例2 Fibonacci数列 无穷数列1,1,2,3,5,8,13,21,34,55,……,称为 Fibonacci数列。它可以递归地定义为:
n 111
(2) q(n,m)=q(n,n),mn; 最大加数n1实际上不能大于n。因此,q(1,m)=1。
2.1 递归的概念
例5 整数划分问题 前面的几个例子中,问题本身都具有比较明显的递归关系,因 而容易用递归函数直接求解。 在本例中,如果设p(n)为正整数n的划分数,则难以找到递归关 系,因此考虑增加一个自变量:将最大加数n1不大于m的划分个 数记作q(n,m)。可以建立q(n,m)的如下递归关系。 (3) q(n,n)=1+q(n,n-1); 正整数n的划分由n1=n的划分和n1≤n-1的划分组成。 (4) q(n,m)=q(n,m-1)+q(n-m,m),n>m>1; 正整数n的最大加数n1不大于m的划分由n1=m的划分和 n1≤m-1 的划分组成。
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 。
2.1 递归的概念
例5 整数划分问题 前面的几个例子中,问题本身都具有比较明显的递归关系,因 而容易用递归函数直接求解。 在本例中,如果设p(n)为正整数n的划分数,则难以找到递归关 系,因此考虑增加一个自变量:将最大加数n1不大于m的划分个 数记作q(n,m)。可以建立q(n,m)的如下递归关系。 (1) q(n,1)=1,n1; 当最大加数n1不大于1时,任何正整数n只有一种划分形式, n 即

M=3时,类似的可以推出 n M=4时,A(n,4)的增长速度非常快,以至于没有适当 的数学式子来表示这一函数。
2
2
2 2
2.1 递归的概念
例3 Ackerman函数 前2例中的函数都可以找到相应的非递归方式定义:
n! 1 2 3 ( n 1) n
1 5 1 F ( n) 2 5
n 1
1 5 2
n 1

本例中的Ackerman函数却无法找到非递归的定义。
例3

2.1 Ackerman 递归的概念 函数
定义单变量的Ackerman函数A(n)为:A(n)=A(n,n) 定义其拟逆函数α(n)为: α(n)=min{k|A(k)≥n}。 即α(n)是使n≤A(k)成立的最小的k值。 例子:A(0)=1,A(1)=2,A(2)=4,A(3)=16 α(1)=0, α(2)=1, 2 α(3)=α(4)=2, 22 α(5)=…=α(16)=3, 2 α(17)= … =α( 65536 )=4, 对通常见到的正整数n,一般都有α(n)≤4
2.1 递归的概念
例2 Fibonacci数列 Fibonacci数列很有意思。来源于繁殖力惊人,基因优秀的兔 子。 1,每一项除以前一项,设为Gn: Gn= Fn+1/Fn = (Fn+Fn-1)/Fn = 1+Fn-1/Fn = 1+1/Gn-1 当n越大,Gn趋于1.618…,黄金比例 (1 5) / 2 2,鹦鹉螺:等角螺曲线,向径和切线的夹角永远不变的曲线
2.1 递归的概念
例5 整数划分问题
3)正整数n划分为若干正奇整数之和的划分数 设:Odd(I,J)表示I划分为J个正奇数的划分数 Even(I,J)表示I划分为J个正偶数的划分数 有如下递推关系: ③J>I&&J<0,Odd(I,J)=0; Odd(1,1)=1,Odd(2,1)=0,Odd(2,2)=1 J>I&&J<0,Even(I,J)=0; Even(1,1)=0,Even(2,1)=1,Even(2,2)=0 总结:n划分为若干正奇数的划分数为 ∑Odd(n,i),(i=1,…,n)
2.1 递归的概念
例5 整数划分问题
3)正整数n划分为若干正奇整数之和的划分数 设:Odd(I,J)表示I划分为J个正奇数的划分数 Even(I,J)表示I划分为J个正偶数的划分数 有如下递推关系: ①Even(I,J)=Odd(I-J,J), 每个偶加数减掉1变为奇加数 ②Odd(I,J)= Odd(I-1,J-1)+Even(I-J,J) 加数含1的方式数 + 加数不含1的方式数
第2章 递归与分治策略
学习要点:

理解递归的概念。 掌握设计有效算法的分治策略。 通过下面的范例学习分治策略设计技巧。 (1)二分搜索技术; (2)大整数乘法; (3)Strassen矩阵乘法; (4)棋盘覆盖; (5)合并排序和快速排序; (6)线性时间选择; (7)最接近点对问题; (8)循环赛日程表。
例5 整数划分问题
2)正整数n划分为m个正整数之和的划分数。 解法二,设d[i][j]表示i划分为j份,视为i个球放入j 个盒子的方法数。有如下递推关系: ①j个盒子有空的,d[i][j]=d[i][j-1],把某一空盒 子拿出来放一边 ②j个盒子都不空,d[i][j]=d[i-j][j],每个盒子扣 掉1个球 ③d[k][0]=0,k>=1; d[k][1]=1,k>=1 总结:n划分为m份的划分数为 d[n][m]
2.1 递归的概念
例5 整数划分问题 将正整数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.1 递归的概念
例3 Ackerman函数
α(n)在复杂度分析中常遇到。对于通常所见 到的正整数n,有α(n)≤4。但在理论上α(n) 没有上界,随着n的增加,它以难以想象的慢 速度趋向正无穷大。 数学上还有这样增长非常慢的函数——多重对 数log﹡n,其定义为: log﹡n=min{i>0,log(i)n<1} log﹡2=1,log﹡4=2,log﹡16=3,log﹡65536=4, log﹡(265536)=5 265536比宇宙原子总数都要多,对于一般的数n, log﹡n≤5。
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)构成。
A(1,0) 2 A(0, m) 1 m0 A(n,0) n 2 n2 A(n, m) A( A(n 1, m), m 1) n, m 1
大家都知道:函数n!趋向无穷速度很快,logn趋向无穷速度 很慢。 但你将看到一个比n!快的多的函数和一个比logn慢的多的函 数,都和Ackerman函数有关。
2.1 递归的概念
例5 整整数划分问题的扩展形式
2)正整数n划分为m个正整数之和的划分数。
解法一,将n的m个整数划分问题看成n块积木堆成m列,这n块积 木从左到右递增的阶梯状。 10的4份划分的三种形式:
该图旋转90度,另一种形 式:
所以,“n划分为m份”=“n划分最大加数不超过m”
2.1 递归的概念
整数划分问题有许多扩展形式,来看如下问题: 1)正整数n划分为若干正整数之和,最大加数不超过m 的划分数 2)正整数n划分为m个正整数之和的划分数 3)正整数n划分为若干正奇整数之和的划分数 4)正整数n划分为互不相同正整数之和的划分数
相关文档
最新文档