算法设计与分析-分治法
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
递归式的求解
• 反向替换法
M(n) = M(n-1)+1 //替换M(n-1)=M(n2)+1 = [M(n-2)+1]+1=M(n-2)+2 //替换M(n-2)=M(n3)+1 = [M(n-3)+1]+2=M(n-3)+2 = …… = [M(n-n)+1]+(n-1)=M(0)+n=n
斐波拉契数列的递归算法
渐近时间复杂度为Θ(nn!)
双递归函数
当一个函数及它的一个变量是由函数自身定义时,称这个函数是双递 归函数。 Ackerman函数A(n,m)定义如下:
A ( 1 ,0 ) 2 A (0 ,m ) 1 m0 A (n ,0 ) n2 n2 (n ,m ) A (A (n 1 ,m ), m1 ) n ,m1 A
//输入:非负整数n //输出:移动圆盘的步骤 public static void hanoi(int n, int a, int b, int c) { if (n > 0){ hanoi(n-1, a, c, b); move(a,b); hanoi(n-1, c, b, a); }
}
该算法的递推式为: 当n=1时,M(1)=1; 当n>1时,M(n)=M(n-1)+1+M(n-1) 渐近时间复杂度为Θ (2n)
Baidu Nhomakorabea
当n=1时,perm(R)=(r),其中r是集合R中唯一的元素; 当n>1时,perm(R)由(r1)perm(R1),(r2)perm(R2),…, (rn)perm(Rn)构成。 其递归函数为:
( 1 ) n 1 T ( n ) n T ( n 1 ) n n 1
运行结果: 1, 2,2, 3,3,3,
递归调用执行情况如下:
主程序 w 3 print(2);
w 2 print(1) ; ( (3)3输出: ) 2, 2
w 1
print(0); ( 4 ) (4) 输出: 1
w 0
返回
w=3; print(w) (1)
(2输出: ) (2) 3, 3, 3
被调用过程结束后, 根据栈顶的返回地址 ,返回到调用者。
为1,2,…,n,现要求将塔座a上的这一叠圆盘移到塔座b上,并仍 按同样顺序叠置。在移动圆盘时应遵守以下移动规则:
规则1:每次只能移动1个圆盘;
规则2:任何时刻都不允
许将较大的圆盘压在较 小的圆盘之上;
规则3:在满足移动规则
1和2的前提下,可将圆盘 移至a,b,c中任一塔座上。
汉诺塔问题的递归算法
全排列问题的递归算法
问题描述:设计一个递归算法生成n个元素{r1,r2,…,rn}的全排列。
设R={r1,r2,…,rn}是要进行排列的n个元素,Ri=R-{ri}。
集合X中元素的全排列记为perm(X)。 (ri)perm(X)表示在全排列perm(X)的每一个排列前加上前缀得到的排 列。R的全排列可归纳定义如下:
阶乘的递归算法
//输入:非负整数n //输出:n!的值 public static int factorial(int n){ if(n==0) return 1; return n*factorial(n-1); 该算法的基本操作 是乘法! }
我们把基本操作的执行次数记为M(n) 当 n=0 时,M(0)=0; 当 n>0 时,M(n)=M(n-1)+1;
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 。
无穷数列1,1,2,3,5,8,13,21,34,55,…,被称为 Fibonacci数列。它可以递归地定义为:
1 n0 F (n ) 1 n 1 F (n 1 )F (n2 ) n 1
//输入:非负整数n //输出:第n个Fibonacci的值 public static int fibonacci(int n){ if (n <= 1) return 1; return fibonacci(n-1)+fibonacci(n-2); }
递归式的求解
• 递归树方法
该算法的基本操作是加法,可表示为S(n). 当n=0,1时,S(0)=0,S(1)=0; 当n≥2时,S(n)=S(n-1)+S(n-2)+1 对应递归树为:
渐近时间复杂度为Θ (2n)
汉诺塔问题
设a,b,c是3个塔座。开始时,在塔座a上有一叠共n个圆盘,这
些圆盘自下而上,由大到小地叠在一起。各圆盘从小到大编号
结束
将返回地址 和调用参数 入栈
top top
top
top top
top
(1 ) w=3 3 (1 )
((2) 2)w=2 2 ((1) 1)w=3 3
(3) 1 ( 3)w=1 (2) 2 ( 2)w=2 3 ((1) 1)w=3
(4 )w=0 (4) 0 (3 )w=1 (3) 1 (2 )w=2 (2) 2 (1 )w=3 (1) 3
第二章 递归与分治策略
课时:6学时
本章主要知识点
• 递归的概念 • 递归算法的数学分析 • 分治法 • 分治法的应用
递归的概念
• 递归定义
用自身的更简单情况(所涉及的问题规模更小),来定义自身, 称为递归定义。 最简单的情况称为递归出口,或递归边界,本身不再使用递归定 义。 算法中,直接或间接地调用自身的算法称为递归算法。
例如:n!的递归定义
n 0 1 n ! n ( n 1 )! n 0
递归边界
递归函数
递归的执行情况分析
public void myPrint(int w) { int i; if ( w!=0) { myPrint(w-1); for(i=1;i<=w;++i) System.out.print(w+”,”); System.out.print(“\n”); } }