计算机算法设计与分析-递归与分治
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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)); }
2020年7月3日
8
整数划分问题
♦ 将正整数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。
2020年7月3日
9
整数划分问题
前面的几个例子中,问题本身都具有比较明显的递归 关系,因而容易用递归函数直接求解。 在本例中,如果设p(n)为正整数n的划分数,则难以 找到递归关系,因此考虑增加一个自变量:将最大加 数n1不大于m的划分个数记作q(n,m)。可以建立 q(n,m)的如下递归关系。
整数划分问题
Hanoi塔问题
例Ha1n:oiH塔a的no解i塔可问以题很:自有然A地、看B、成C这三样根一柱个子过。程A: (1)上先有将nA个上圆面盘,自下而上由大到小地叠在一起。
n–现1个要盘将借A助上的B 全部于圆是可盘得到如下的程序:
移移至到C。B上,并要求vo:id (H1a)noi(int n, int Fr, int To, int As)
2020/7/3
计算机算法设计与分析
2
提纲
一、递归的概念 二、分治法的基本思想 三、分治法的时间复杂性分析 四、分治法的应用
2020年7月3日
3
提纲
一、递归的概念 二、分治法的基本思想 三、分治法法的时间复杂性分析 四、分治法的应用
2020年7月3日
4
递归的概念
简单地说,递归就是用自己来定义自己。 一般地说,一个递归过程P可以表示为基语句
移三至个B柱。子间移动。 }
2020/7/3
计算机算法设计与分析
13
递归函数的运行轨迹
在递归函数中,调用函数和被调用函数是同 一个函数,需要注意的是递归函数的调用层 次。
如果把调用递归函数的主函数称为第0层, 进入函数后,首次递归调用自身称为第1层 调用;从第i层递归调用自身称为第i+1层。 反之,退出第i+1层调用应该返回第i层。
2020/7/3
计算机算法设计与分析
6
阶乘函数
阶乘函数可递归地定义为:
n!
1 n(n 1)!
n0 n0
边界条件
递归方程
边界条件与递归方程是 递归函数的二个要素。递 归函数只有具备了这两个 要素,才能在有限次计算 后得出结果。
int factorial(int n) { if (n==0) return 1;
(的2)每盘允1再个次 ; 许将盘(只 将A2移)能 较上任至移 大剩何B动 的下时。一圆刻个盘都圆压不{
if (n > 0) { HAanoi(n–1B, A, C, B)C;
(3在)最较后小将的C圆上盘的上;(3) Move(A, B);
n–圆1个盘盘只借能助在AA、B、C
Hanoi(n–1, C, B, A)}
return n*factorial(n-1); }
2020年7月ቤተ መጻሕፍቲ ባይዱ日
7
Fibonacci数列
无穷数列1,1,2,3,5,8,13,21,34,55,……,称 为Fibonacci数列。递归定义为:
1
n0
F
(n)
1
n 1
F (n 1) F (n 2) n 2
边界条件 递归方程
int fibonacci(int n) { if (n <= 1) return 1; return fibonacci(n-1)+fibonacci(n-2); }
S(不含P)和P自身的组合β:
P β(S, P) 这样的表示包含了过程不终止的可能,因此递
归算法应更准确地表述为
P if B then Q else β(S, P)
其中Q也不包含P,B为递归终止条件。
2020/7/3
计算机算法设计与分析
5
递归算法
直接或间接地调用自身的算法称为递归算法。 用函数自身给出定义的函数称为递归函数。
由分治法产生的子问题往往是原问题的较小模 式,这就为使用递归技术提供了方便。在这种 情况下,反复应用分治手段,可以使子问题与 原问题类型一致而其规模却不断缩小,最终使 子问题缩小到很容易直接求出其解。这自然导 致递归过程的产生。
分治与递归像一对孪生兄弟,经常同时应用在 算法设计之中,并由此产生许多高效算法。
第二章 递归与分治
2020/7/3
计算机算法设计与分析
1
学习要点:
•理解递归的概念。 •掌握求解递归算法时间复杂度的一般方法。 •掌握设计有效算法的分治策略。 •通过下面的范例学习分治策略设计技巧。 (1)二分搜索技术; (2)大整数乘法; (3)Strassen矩阵乘法; (4)棋盘覆盖; (5)合并排序和快速排序; (6)循环赛日程表。
(1) q(n,1)=1,n1;
当最大加数n1不大于1时,任何正整数n只有一种划分形式,
即
n
n 11 1
(2) q(n,m)=q(n,n),mn; 最大加数n1实际上不能大于n。因此,q(1,m)=1。
(3) q(n,n)=1+q(n,n-1); 正整数n的划分由n1=n的划分和n1≤n-1的划分组成。
采用图示方法描述递归函数的运行轨迹,从 中可较直观地了解到各调用层次及其执行情 况。
2020年7月3日
14
Hanoi塔的运行轨迹
(4) q(n,m)=q(n,m-1)+q(n-m,m),n>m>1; 正整数n的最大加数n1不大于m的划分由n1=m的划分和 n1≤m-1 的划分组成。
整数划分问题
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的划分数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)); }
2020年7月3日
8
整数划分问题
♦ 将正整数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。
2020年7月3日
9
整数划分问题
前面的几个例子中,问题本身都具有比较明显的递归 关系,因而容易用递归函数直接求解。 在本例中,如果设p(n)为正整数n的划分数,则难以 找到递归关系,因此考虑增加一个自变量:将最大加 数n1不大于m的划分个数记作q(n,m)。可以建立 q(n,m)的如下递归关系。
整数划分问题
Hanoi塔问题
例Ha1n:oiH塔a的no解i塔可问以题很:自有然A地、看B、成C这三样根一柱个子过。程A: (1)上先有将nA个上圆面盘,自下而上由大到小地叠在一起。
n–现1个要盘将借A助上的B 全部于圆是可盘得到如下的程序:
移移至到C。B上,并要求vo:id (H1a)noi(int n, int Fr, int To, int As)
2020/7/3
计算机算法设计与分析
2
提纲
一、递归的概念 二、分治法的基本思想 三、分治法的时间复杂性分析 四、分治法的应用
2020年7月3日
3
提纲
一、递归的概念 二、分治法的基本思想 三、分治法法的时间复杂性分析 四、分治法的应用
2020年7月3日
4
递归的概念
简单地说,递归就是用自己来定义自己。 一般地说,一个递归过程P可以表示为基语句
移三至个B柱。子间移动。 }
2020/7/3
计算机算法设计与分析
13
递归函数的运行轨迹
在递归函数中,调用函数和被调用函数是同 一个函数,需要注意的是递归函数的调用层 次。
如果把调用递归函数的主函数称为第0层, 进入函数后,首次递归调用自身称为第1层 调用;从第i层递归调用自身称为第i+1层。 反之,退出第i+1层调用应该返回第i层。
2020/7/3
计算机算法设计与分析
6
阶乘函数
阶乘函数可递归地定义为:
n!
1 n(n 1)!
n0 n0
边界条件
递归方程
边界条件与递归方程是 递归函数的二个要素。递 归函数只有具备了这两个 要素,才能在有限次计算 后得出结果。
int factorial(int n) { if (n==0) return 1;
(的2)每盘允1再个次 ; 许将盘(只 将A2移)能 较上任至移 大剩何B动 的下时。一圆刻个盘都圆压不{
if (n > 0) { HAanoi(n–1B, A, C, B)C;
(3在)最较后小将的C圆上盘的上;(3) Move(A, B);
n–圆1个盘盘只借能助在AA、B、C
Hanoi(n–1, C, B, A)}
return n*factorial(n-1); }
2020年7月ቤተ መጻሕፍቲ ባይዱ日
7
Fibonacci数列
无穷数列1,1,2,3,5,8,13,21,34,55,……,称 为Fibonacci数列。递归定义为:
1
n0
F
(n)
1
n 1
F (n 1) F (n 2) n 2
边界条件 递归方程
int fibonacci(int n) { if (n <= 1) return 1; return fibonacci(n-1)+fibonacci(n-2); }
S(不含P)和P自身的组合β:
P β(S, P) 这样的表示包含了过程不终止的可能,因此递
归算法应更准确地表述为
P if B then Q else β(S, P)
其中Q也不包含P,B为递归终止条件。
2020/7/3
计算机算法设计与分析
5
递归算法
直接或间接地调用自身的算法称为递归算法。 用函数自身给出定义的函数称为递归函数。
由分治法产生的子问题往往是原问题的较小模 式,这就为使用递归技术提供了方便。在这种 情况下,反复应用分治手段,可以使子问题与 原问题类型一致而其规模却不断缩小,最终使 子问题缩小到很容易直接求出其解。这自然导 致递归过程的产生。
分治与递归像一对孪生兄弟,经常同时应用在 算法设计之中,并由此产生许多高效算法。
第二章 递归与分治
2020/7/3
计算机算法设计与分析
1
学习要点:
•理解递归的概念。 •掌握求解递归算法时间复杂度的一般方法。 •掌握设计有效算法的分治策略。 •通过下面的范例学习分治策略设计技巧。 (1)二分搜索技术; (2)大整数乘法; (3)Strassen矩阵乘法; (4)棋盘覆盖; (5)合并排序和快速排序; (6)循环赛日程表。
(1) q(n,1)=1,n1;
当最大加数n1不大于1时,任何正整数n只有一种划分形式,
即
n
n 11 1
(2) q(n,m)=q(n,n),mn; 最大加数n1实际上不能大于n。因此,q(1,m)=1。
(3) q(n,n)=1+q(n,n-1); 正整数n的划分由n1=n的划分和n1≤n-1的划分组成。
采用图示方法描述递归函数的运行轨迹,从 中可较直观地了解到各调用层次及其执行情 况。
2020年7月3日
14
Hanoi塔的运行轨迹
(4) q(n,m)=q(n,m-1)+q(n-m,m),n>m>1; 正整数n的最大加数n1不大于m的划分由n1=m的划分和 n1≤m-1 的划分组成。
整数划分问题
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