第1章递归方程解的渐近阶的求法
循环渐进法
循环渐进法循环渐进法,又称迭代法或递推法,是一种求解复杂问题的数学方法。
它的基本思想是将问题分解成一个个简单的子问题,逐步求解,最终得到整个问题的解。
循环渐进法适用于一些数学上的求解问题,如差分方程、递推序列等。
这些问题通常可以用一个递推公式来表示,即当前状态与前面状态之间的关系。
通过迭代计算,逐步推进,最终得到问题的解。
循环渐进法的核心在于迭代过程。
假设要求解某个问题的解,那么首先需要确定一个初始状态,即问题的起点。
然后根据问题的递推公式,计算出下一个状态,即问题的下一步。
重复这个过程,直到得到问题的最终解。
以求解斐波那契数列为例,其递推公式为f(n)=f(n-1)+f(n-2),其中f(0)=0,f(1)=1。
从初始状态开始,依次计算出后续的状态,如下所示:f(0)=0f(1)=1f(2)=f(1)+f(0)=1f(3)=f(2)+f(1)=2f(4)=f(3)+f(2)=3f(5)=f(4)+f(3)=5f(6)=f(5)+f(4)=8……通过不断迭代计算,可以得到斐波那契数列的所有项。
这种方法的优点在于简单易懂,容易实现。
缺点则在于计算量较大,在求解复杂问题时会比较耗时。
除了递推序列外,循环渐进法还可以应用于求解一些几何问题,如曲线拟合、图形变形等。
在这些问题中,可以通过不断迭代,调整图形的形状,逐渐接近目标状态。
总体来说,循环渐进法是一种非常有用的数学工具,可以用于求解多种问题,并广泛应用于科学、工程等领域中。
对于掌握该方法的学生和研究人员,将有助于提高问题解决的能力和效率,从而更好地应对实际问题。
递归算法详解
递归冯文科一、递归的基本概念。
一个函数、概念或数学结构,如果在其定义或说明内部直接或间接地出现对其本身的引用,或者是为了描述问题的某一状态,必须要用至它的上一状态,而描述上一状态,又必须用到它的上一状态……这种用自己来定义自己的方法,称之为递归或递归定义。
在程序设计中,函数直接或间接调用自己,就被称为递归调用。
二、递归的最简单应用:通过各项关系及初值求数列的某一项。
在数学中,有这样一种数列,很难求出它的通项公式,但数列中各项间关系却很简单,于是人们想出另一种办法来描述这种数列:通过初值及a与前面临n近几项之间的关系。
要使用这样的描述方式,至少要提供两个信息:一是最前面几项的数值,一是数列间各项的关系。
比如阶乘数列1、2、6、24、120、720……如果用上面的方式来描述它,应该是:如果需要写一个函数来求a的值,那么可以很容易地写成这样:n这就是递归函数的最简单形式,从中可以明显看出递归函数都有的一个特点:先处理一些特殊情况——这也是递归函数的第一个出口,再处理递归关系——这形成递归函数的第二个出口。
递归函数的执行过程总是先通过递归关系不断地缩小问题的规模,直到简单到可以作为特殊情况处理而得出直接的结果,再通过递归关系逐层返回到原来的数据规模,最终得出问题的解。
以上面求阶乘数列的函数)f为例。
如在求)3(f时,由于3不是特殊值,因(n此需要计算)2(*3f,但)2(f是对它自己的调用,于是再计算)2(f,2也不是特殊值,需要计算)1(2f,需要知道)1(f的值,再计算)1(f,1是特殊值,于是直*接得出1)2(=2f,再返回上一步,得=f)1(*)1(=f,返回上一步,得23)3(=f,从而得最终解。
=f=*6)2(23*用图解来说明,就是下面再看一个稍复杂点的例子。
【例1】数列}{n a 的前几项为1、111+、11111++、1111111+++、……输入n ,编程求n a 的精确分数解。
分析:这个题目较易,发现11=a ,其它情况下有111-+=n n a a 。
函数递归法求解
函数递归法求解一、课程目标知识目标:1. 理解函数递归的基本概念,掌握递归函数的定义和特点。
2. 学会运用递归法解决特定数学问题,如计算斐波那契数列、求解阶乘等。
3. 能够分析递归算法的时间复杂度和空间复杂度,理解递归算法的性能。
技能目标:1. 培养学生运用递归思想解决问题的能力,提高编程技巧。
2. 能够熟练编写递归函数,并通过实例进行验证。
3. 学会使用递归树、递归方程等方法分析递归算法的正确性和效率。
情感态度价值观目标:1. 培养学生对函数递归的兴趣和好奇心,激发探究精神。
2. 培养学生团队协作意识,学会在合作中分享、交流、互助。
3. 培养学生面对复杂问题时,具有勇于挑战、积极进取的态度。
课程性质:本课程为计算机科学、数学等相关专业的高年级学生设计,旨在通过函数递归法求解实际问题,提高学生的编程能力、算法分析能力和问题解决能力。
学生特点:学生已具备基本的编程知识,熟悉函数的定义和调用,具有一定的数学基础,但对递归思想和算法分析尚不够熟练。
教学要求:教师应注重理论与实践相结合,通过实例分析、课堂讨论、课后练习等多种方式,帮助学生掌握递归法求解问题的方法和技巧。
同时,关注学生的个体差异,提供有针对性的辅导,以提高全体学生的学习效果。
在教学过程中,将课程目标分解为具体的学习成果,便于后续教学设计和评估。
二、教学内容本课程教学内容主要包括以下三个方面:1. 函数递归基础理论:- 递归概念与递归函数定义- 递归的分类:直接递归与间接递归- 递归的三大要素:递归条件、递归关系和边界条件2. 递归法求解实际问题:- 斐波那契数列的递归求解- 阶乘的递归求解- 其他典型递归问题:汉诺塔、迷宫问题等3. 递归算法分析与优化:- 递归算法的时间复杂度与空间复杂度分析- 递归树方法分析递归算法- 递归方程求解方法- 递归优化策略:尾递归优化、记忆化搜索等教学内容安排与进度:1. 函数递归基础理论(2课时)2. 递归法求解实际问题(3课时)3. 递归算法分析与优化(3课时)教材章节关联:1. 函数递归基础理论:参考教材第3章第5节2. 递归法求解实际问题:参考教材第4章第2节3. 递归算法分析与优化:参考教材第4章第3节在教学过程中,将根据学生的实际水平和学习进度,适当调整教学内容和进度,确保学生能够扎实掌握递归法求解问题的方法和技巧。
结构力学课件12渐近法
43.5
46.9
24.5
14.7
3.45
1.7
9.8
4.89
M图
例2.
4m
4m
5m
4m
2m
q=20kN/m
A
B
C
D
F
E
*
A
B
C
1m
5m
1m
EI=常数
D
50kN
5/6
1/6
50
25
-20.8
-4.2
-20.8
+20.8
+50
例3. 带悬臂杆件的结构的力矩分配法。
50kN·m
A
B
M
M/2
A
B
*
C
B
例1.用力矩分配法列表计算图示连续梁。
A
B
C
D
6m
6m
4m
4m
EI=1
EI=2
EI=1
20kN/m
100kN
0.4
0.6
0.667
0.333
m
-60
60
-100
100
分配与传递
-33.3
-66.7
-33.4
29.4
44
22
14.7
-14.7
-7.3
-7.3
4.4
2.9
2.2
-1.5
-0.7
-0.7
固端弯矩之和
(第一轮第二、三……结点)
固端弯矩之和 加传递弯矩
传递弯矩
(其它轮次各结点)
总等于附加刚臂上的约束力矩
5)不能同时放松相邻结点(因定不出其转动刚度和传递系数),但可 以同时放松所有不相邻的结点,以加快收敛速度。
算法常用数学工具_递归方程求解
k 1 k 1 n n
3
f (n) 2 f (n 1) 1 f (1) 1
3.2 用递推方法求汉诺塔问题的 复杂度
20 * f (n) 20 * 2 f (n 1) 20 *1 1 1 1 2 * f ( n 1 ) 2 * 2 f ( n 2 ) 2 *1 ...... 2 n 3 * f (3) 2 n 3 * 2 f (2) 2 n 3 *1 n2 n2 n2 2 * f ( 2 ) 2 * 2 f ( 1 ) 2 *1
n n
待定系数的线性方程组的解是:c1=5/9, c2=-1/3, c3=4/9
c1 c3 1 2c1 2c2 - c3 0 4c 8c c 0 2 3 1
通解:
5 n 1 n 4 n f (n) 2 - n2 - 1 9 3 9
2.5 k阶常系数线性非齐次递归方程
第2章 常用数学工具
1. 用生成函数求解递归方程 2. 用特征方程求解递归方程
3. 用递推方法求解递归方程
1. 用生成函数求解递归方程
1.1 什么是生成函数 1.2 生成函数的性质
1.3 用生成函数求解汉诺塔问题
1.4 用生成函数求解Fabanacci数 列通项
1.1 什么是生成函数
对于实数序列:
f (n) a1 f (n 1) a2 f (n 2) ... ak f (n k ) g (n) 初始条件 通解为: f (n) f (n) f * (n) 即齐次通解+特解
确定特解的任务就成为关键。根据齐次特征方程 根的情况,特解可以分为两种情况: 没有等于1的特征根:特解的多项式次数与g(n) 相同; 含有等于1的特征根:特解的多项式次数比g(n) 大1,但不含常数项。
第1章递归方程解的渐近阶的求法
目录递归方程组解的渐进阶的求法——代入法................................ 错误!未定义书签。
递归方程组解的渐进阶的求法——迭代法................................ 错误!未定义书签。
递归方程组解的渐进阶的求法——套用公式法......................... 错误!未定义书签。
递归方程组解的渐进阶的求法——差分方程法......................... 错误!未定义书签。
递归方程组解的渐进阶的求法——母函数法............................ 错误!未定义书签。
递归方程解的渐近阶的求法递归方程组解的渐进阶的求法——套用公式法这个方法为估计形如:T(n)=aT(n/b)+f(n) (6.17)的递归方程解的渐近阶提供三个可套用的公式。
(6.17)中的a≥1和b≥1是常数,f (n)是一个确定的正函数。
(6.17)是一类分治法的时间复杂性所满足的递归关系,即一个规模为n的问题被分成规模均为n/b的a个子间题,递归地求解这a个子问题,然后通过对这a个子间题的解的综合,得到原问题的解。
如果用T(n)表示规模为n的原问题的复杂性,用f(n)表示把原问题分成a 个子问题和将a个子问题的解综合为原问题的解所需要的时间,我们便有方程(6.17)。
这个方法依据的是如下的定理:设a≥1和b≥1是常数f(n)是定义在非负整数上的一个确定的非负函数。
又设T(n)也是定义在非负整数上的一个非负函数,且满足递归方程(6.17)。
方程(6.17)中的n/b可以是[n/b],也可以是n/b。
那么,在f(n)的三类情况下,我们有T(n)的渐近估计式:1. 若对于某常数ε>0,有,则;2. 若,则;3. 若对其常数ε>0,有且对于某常数c>1和所有充分大的正整数n有af(n/b)≤cf(n),则T(n)=θ(f(n))。
算法21--内部排序--归并排序
实现这种递归调用的关键是为过程建立递归调用工作栈。通 常,在一个过程中调用另一过程时,系统需在运行被调用过 程之前先完成3件事:
(1)将所有实参指针,返回地址等信息传递给被调用过程; (2)为被调用过程的局部变量分配存储区; (3)将控制转移到被调用过程的入口。 在从被调用过程返回调用过程时,系统也相应地要完成3件事: (1)保存被调用过程的计算结果; (2)释放分配给被调用过程的数据区; (3)依照被凋用过程保存的返回地址将控制转移到调用过程.
实际的意义:可以把一个长度为n 的无序序列看成 是 n 个长度为 1 的有序子序列 ,首先做两两归 并,得到 n/2 个长度为 2 的子序列;再做两两 归并,…,如此重复,直到最后得到一个长度为 n
的有序序列。
归并排序
初始序列
[49] [38] [65] [97 [76] [13] [27]
第一步 第二步
T(1)=1 T(n)=kT(n/m)+f(n)
2019/10/20
归并排序时间复杂性分析
• 合并趟数: log2n • 每趟进行比较的代价 n • 总的代价为 T(n) = O ( nlog2n ) • 在一般情况下:
c
n=1
T(n) =
T( n/2 ) + T( n/2 ) + cn n>1
优缺点:Ω的这个定义的优点是与O的定义对称,缺点 是当 f(N) 对自然数的不同无穷子集有不同的表达式, 且有不同的阶时,未能很好地刻画出 f(N)的下界。
2019/10/20
f(n) cg(n)
n0
n
2019/10/20
代入法解递归方程
方法的关键步骤在于预先对解答作出推测,然后用 数学归纳法证明推测的正确性。
渐近方法 —函数的展开
f ( z) a0 w0 ( z) a1w1 ( z) an wn ( z) o[wn ( z))] z z0
那么称此为 f ( x) 在 z 0 点的渐近展式。记为
f ( z ) an wn ( z ) z z0
n
注意:渐近展式与函数的级数展式不同:对确定的z值,渐近 展式的项数无限增多时,所得级数一般是发散的,但若满足 渐近展式的定义式,则当 z z0 时,取确定的项数n会得到 对函数非常好的近似。
n 1 n n
N
是
z z0
时,
f ( z ) 的一个直到N项的渐近展开式。
§ 2.2 渐近展开 证明: 首先证明
§ 2 渐近方法
wn ( z)
k n 1
是一个渐近序列。由
ak
的定义得
f ( z ) an wn ( z ) g k ( z ) o(wk ) f ( z ) an wn ( z ) ak 1wk 1 ( z ) hk ( z ) ak 1wk 1 ( z ) o(wk 1 )
N
n 0
是D中, z z0 时, f ( z ) 的一个渐近
N
幂级数展式,记为
f ( z ) an ( z z0 ) n
n 0
z z0
其中一种重要的特殊情形是在D中,当 z0 时,如果
an f ( z ) n o( z n ) n 0 z
N
则在D中,当 z 时 f ( z ) ~
§ 2.3 渐近展式的运算 推论2: 对 arg z ,当
§ 2 渐近方法
z
时有
f ( z ) an z n
对于一个规模为n的问题
分治法简介对于一个规模为n的问题,若该问题可以容易地解决(比如说规模n较小)则直接解决,否则将其分解为k个规模较小的子问题,这些子问题互相独立且与原问题形式相同,递归地解这些子问题,然后将各子问题的解合并得到原问题的解。
这种算法设计策略叫做分治法。
分治法的基本思想任何一个可以用计算机求解的问题所需的计算时间都与其规模有关。
问题的规模越小,越容易直接求解,解题所需的计算时间也越少。
例如,对于n个元素的排序问题,当n=1时,不需任何计算。
n=2时,只要作一次比较即可排好序。
n=3时只要作3次比较即可,…。
而当n较大时,问题就不那么容易处理了。
要想直接解决一个规模较大的问题,有时是相当困难的。
分治法的设计思想是,将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。
如果原问题可分割成k个子问题,1<k≤n ,且这些子问题都可解,并可利用这些子问题的解求出原问题的解,那么这种分治法就是可行的。
由分治法产生的子问题往往是原问题的较小模式,这就为使用递归技术提供了方便。
在这种情况下,反复应用分治手段,可以使子问题与原问题类型一致而其规模却不断缩小,最终使子问题缩小到很容易直接求出其解。
这自然导致递归过程的产生。
分治与递归像一对孪生兄弟,经常同时应用在算法设计之中,并由此产生许多高效算法。
分治法的适用条件分治法所能解决的问题一般具有以下几个特征:1.该问题的规模缩小到一定的程度就可以容易地解决;2.该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质。
3.利用该问题分解出的子问题的解可以合并为该问题的解;4.该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子子问题。
上述的第一条特征是绝大多数问题都可以满足的,因为问题的计算复杂性一般是随着问题规模的增加而增加;第二条特征是应用分治法的前提,它也是大多数问题可以满足的,此特征反映了递归思想的应用;第三条特征是关键,能否利用分治法完全取决于问题是否具有第三条特征,如果具备了第一条和第二条特征,而不具备第三条特征,则可以考虑贪心法或动态规划法。
递归式的三种求解方式
递归式的三种求解⽅式求解递归式对于分冶算法的重要性不⾔⽽喻以下介绍了三种求解递归式的⽅法1,代换法:缺点:代换法主要的缺点在于,对于任何递归式,我们先得去猜其解,对于猜错了同学,如果不幸猜出的结果和正确结果相差太⼤,虽然可以推导,但是意义不⼤;优点:代换法相较于递归树法更为严谨,相较于主定理应⽤范围更⼴,主定理只能求解类似于T(n) = aT(n/b)+n/c这种形式的递归式;下⾯给出⼀个递归表达式T(n) = 2T(n/2)+n,求其解;⾸先猜⼀下其解为O(nlgn);那么我们只需要证明T(n)<cnlgn即可先假设T(n)<cnlgn对于n/2也成⽴,那么T(n/2)<=c(n/2)lg(n/2)也成⽴那么必然的T(n)<=2(c(n/2)(lgn/2))+n-=cnlgn-cnlg2+n<=cnlgn-cn+n以上表达式,在c>=1时永远成⽴,得证递归式T(n) = 2T(n/2)+n的解为O(nlgn)其他递归式的求解⽅式和上⾯的⼤体相似;2,递归树法递归树⽅法利⽤了将递归式分解为⼀棵递归树的形式来更加直观的求解递归式;缺点:递归树⽅法求解递归式因为丢弃了很多低阶项,所以不够严谨;优点:递归树⽅法求解递归式从视觉上更为直观,简单。
⼀般可以先运⽤递归树求解,然后利⽤代换法更加严谨得证明⽤递归树求解的解的数学上的正确性;下⾯求T(n) = 2T(n/2)+n的解⾸先将上述递归表达式⽤递归树表达出来,不会画图,⽐较丑。
以上递归式的深度为lgn,每层的代价为n,⾃然推导出T(n) = T(n/2)的解为O(nlgn)以上递归式的求解⽐较简单更为复杂的求解参考算法导论;3,主定理主定理是最为简单求解递归式的解的⽅法,也是我最为喜欢的⼀种分析⽅法主定理给出如下的如下形式的通⽤的递归式:T(n) = aT(n/b)+f(n)主定理套公式分为以下三种情况符号打得⼼累直接截图:以上为三种递归式的求解⽅法。
9递归方程组解的渐进阶的求法——套用公式法
递归方程组解的渐进阶的求法——套用公式法这个方法为估计形如:T(n)=aT(n/b)+f(n) (6.17)的递归方程解的渐近阶提供三个可套用的公式。
(6.17)中的a≥1和b≥1是常数,f (n)是一个确定的正函数。
(6.17)是一类分治法的时间复杂性所满足的递归关系,即一个规模为n的问题被分成规模均为n/b的a个子间题,递归地求解这a个子问题,然后通过对这a个子间题的解的综合,得到原问题的解。
如果用T(n)表示规模为n的原问题的复杂性,用f(n)表示把原问题分成a个子问题和将a个子问题的解综合为原问题的解所需要的时间,我们便有方程(6.17)。
这个方法依据的是如下的定理:设a≥1和b≥1是常数f (n)是定义在非负整数上的一个确定的非负函数。
又设T(n)也是定义在非负整数上的一个非负函数,且满足递归方程(6.17)。
方程(6.17)中的n/b可以是[n/b],也可以是n/b。
那么,在f(n)的三类情况下,我们有T(n)的渐近估计式:1.若对于某常数ε>0,有,则;2.若,则;3.若对其常数ε>0,有且对于某常数c>1和所有充分大的正整数n有af(n/b)≤cf(n),则T(n)=θ(f(n))。
这里省略定理的证明。
在应用这个定理到一些实例之前,让我们先指出定理的直观含义,以帮助读者理解这个定理。
读者可能已经注意到,这里涉及的三类情况,都是拿f(n)与作比较。
定理直观地告诉我们,递归方程解的渐近阶由这两个函数中的较大者决定。
在第一类情况下,函数较大,则T(n)=θ();在第三类情况下,函数f(n)较大,则T(n)=θ(f (n));在第二类情况下,两个函数一样大,则T(n)=θ(),即以n的对数作为因子乘上f(n)与T(n)的同阶。
此外,定理中的一些细节不能忽视。
在第一类情况下f(n)不仅必须比小,而且必须是多项式地比小,即f(n)必须渐近地小于与的积,ε是一个正的常数;在第三类情况下f(n)不仅必须比大,而且必须是多项式地比大,还要满足附加的“正规性”条件:af(n/b)≤cf(n)。
递归方程解的渐近阶的求法
递归方程解的渐近阶的求法递归算法在最坏情况下的时间复杂性渐近阶的分析,都转化为求相应的一个递归方程的解的渐近阶。
因此,求递归方程的解的渐近阶是对递归算法进行分析的关键步骤。
递归方程的形式多种多样,求其解的渐近阶的方法也多种多样。
这里只介绍比较实用的五种方法。
1.代入法这个方法的基本步骤是先推测递归方程的显式解,然后用数学归纳法证明这一推测的正确性。
那么,显式解的渐近阶即为所求。
2.迭代法这个方法的基本步骤是通过反复迭代,将递归方程的右端变换成一个级数,然后求级数的和,再估计和的渐近阶;或者,不求级数的和而直接估计级数的渐近阶,从而达到对递归方程解的渐近阶的估计。
3.套用公式法这个方法针对形如:T (n)=aT (n / b)+f (n) 的递归方程,给出三种情况下方程解的渐近阶的三个相应估计公式供套用。
4.差分方程法有些递归方程可以看成一个差分方程,因而可以用解差分方程(初值问题)的方法来解递归方程。
然后对得到的解作渐近阶的估计。
5.母函数法这是一个有广泛适用性的方法。
它不仅可以用来求解线性常系数高阶齐次和非齐次的递归方程,而且可以用来求解线性变系数高阶齐次和非齐次的递归方程,甚至可以用来求解非线性递归方程。
方法的基本思想是设定递归方程解的母函数,努力建立一个关于母函数的可解方程,将其解出,然后返回递归方程的解。
本章将逐一地介绍上述五种方法,并分别举例加以说明。
本来,递归方程都带有初始条件,为了简明起见,我们在下面的讨论中略去这些初始条件。
递归方程组解的渐进阶的求法——代入法用这个办法既可估计上界也可估计下界。
如前面所指出,方法的关键步骤在于预先对解答作出推测,然后用数学归纳法证明推测的正确性。
例如,我们要估计T(n)的上界,T(n)满足递归方程:其中是地板(floors)函数的记号,表示不大于n的最大整数。
我们推测T(n)=O(n log n),即推测存在正的常数C和自然数n0,使得当n≥n0时有:T(n)≤Cn log n事实上,取n0=22=4,并取那么,当n0≤n≤2n0时,成立。
算法设计与分析-递归法
b)
cn k
n1 n1
O (nlog b a ) T (n) O(nk log b n) O(nk )
a bk a bk a bk
但是并非所有的递推式都可以用公式法求解。 例T(n)=2T(n/2)+nlogn 由于a=2, b=2, f(n)=nlogn和nlogba=n。看起来似乎属于 主定理情况(3),但事实上f(n)只是渐近大于n,但并不 是多项式大于n。f(n)与的nlogba比值是log n,对于任何 正数,log n渐近小于n,所以,此例不能运用定理。
1 替换方法
替换方法要求首先猜测递推式的解,然后用归纳法证明。
例2.2 T(n) 2T(n / 2) n
需要注意在上述证明过程中,没有考虑初始条件,而初始条 件是归纳法成立的基础。上例归纳证明的初始条件是是 T(1)≤c,只要选择足够大的c≥1即成立。
2.迭代方法
迭代方法的思想是扩展递推式,将递推式先转换成 一个和式,然后计算该和式,得到渐近复杂度。 例2.4 使用迭代方法分析 T (n) 2T (n / 2) n2
本章要点
• 递归算法特性
• 递推关系 • 递归算法的应用
章节内容
2.1 递归算法 2.1.1 递归算法特性 2.1.2 递归算法的执行过程 2.1.3 递推关系
2.2 递归法应用举例
2.3 典型问题的C++程序
2.4 小结
2.1 递归法
2.1.1 递归算法的特性
若一个算法直接的或间接的调用自己本身,则称这个算 法是递归算法。递归本质上也是一种循环的算法结构,它把较 复杂的计算逐次归结为较简单的情形的计算,直到归结到最简 单情形的计算,并最终得到计算结果为止。
主定理求解递归方程
主定理求解递归方程在计算机科学和算法设计中,递归是一种常见的问题解决方法。
递归方程是描述递归算法执行时间复杂度的重要工具。
然而,解决递归方程并确定算法的时间复杂度并不总是容易的。
这时,主定理(Master Theorem)就发挥了重要的作用,它提供了一种快速计算递归方程时间复杂度的方法。
主定理是由计算机科学家Jon Bentley和Robert Sedgewick在1976年提出的,它给出了一种通用的递归方程求解方法,适用于一类形式化的递归方程。
具体来说,主定理适用于具有以下形式的递归方程:T(n) = aT(n/b) + f(n)其中,T(n)表示问题规模为n时的时间复杂度,a是递归调用的子问题个数,n/b是子问题的规模,f(n)表示分解和合并子问题所需的额外工作量。
主定理的关键是通过比较f(n)和n^log_b(a)的大小关系,将递归方程划分为三个不同的情况,分别对应着递归算法的时间复杂度。
第一种情况是当f(n) = O(n^log_b(a-ε)),其中ε>0,存在一个常数c<1,使得af(n/b) ≤ cf(n)对于足够大的n成立。
这时,主定理给出的时间复杂度为T(n) = Θ(n^log_b(a))。
第二种情况是当f(n) = Θ(n^log_b(a)),即f(n)与n^log_b(a)同阶。
这时,主定理给出的时间复杂度为T(n) = Θ(n^log_b(a) * log n)。
第三种情况是当f(n) = Ω(n^log_b(a+ε)),其中ε>0,存在一个常数c>1,使得af(n/b) ≥ cf(n)对于足够大的n成立,并且存在一个常数d<1,使得对于足够大的n,af(n/b) ≤ df(n)。
这时,主定理给出的时间复杂度为T(n) = Θ(f(n))。
通过应用主定理,我们可以快速得到递归方程的时间复杂度,而无需详细展开递归式并进行复杂的推导。
这为算法设计和分析提供了便利,使得我们能够更快速地估计算法的运行时间。
c语言递归解决台阶问题
c语言递归解决台阶问题摘要:一、问题的提出1.台阶问题的背景2.台阶问题的描述二、递归解决台阶问题的原理1.递归的定义2.递归解决台阶问题的基本思想三、C 语言实现递归解决台阶问题1.递归函数的定义2.递归调用过程3.递归结束条件四、台阶问题的C 语言递归解决方案1.代码实现2.运行结果五、递归解决台阶问题的优缺点分析1.优点2.缺点六、结论1.递归解决台阶问题的意义2.未来研究方向一、问题的提出在日常生活中,我们常常会遇到一些需要爬楼梯的问题。
假设有一个n 阶台阶,每次可以爬1 阶或者2 阶,那么有多少种不同的爬楼梯方法呢?这就是著名的台阶问题。
为了解决这个问题,我们可以采用递归的方法。
二、递归解决台阶问题的原理递归是一种编程技巧,它指的是在一个函数中调用自身。
递归解决台阶问题的基本思想是将问题不断缩小规模,直至达到最小的规模1,此时问题变得简单,可以直接求解。
三、C 语言实现递归解决台阶问题我们可以定义一个递归函数来解决这个问题。
递归函数的定义如下:```cvoid climbStairs(int n, int* ways) {if (n == 1 || n == 2) {ways[n] = 1;} else {ways[n] = ways[n - 1] + ways[n - 2];}}```在递归调用过程中,函数将不断调用自身,直到n 减小到1 或者2。
递归结束条件是当n 达到1 或2 时,此时ways 数组中已经存储了相应的四、台阶问题的C 语言递归解决方案以下是递归解决台阶问题的完整C 语言代码:```c#include <stdio.h>void climbStairs(int n, int* ways) {if (n == 1 || n == 2) {ways[n] = 1;} else {ways[n] = ways[n - 1] + ways[n - 2];}}int main() {int n;printf("请输入台阶数:");scanf("%d", &n);int ways[100];for (int i = 0; i <= n; i++) {ways[i] = 0;}climbStairs(n, ways);printf("共有%d种不同的爬楼梯方法", ways[n]);return 0;}```运行结果表明,当台阶数为n 时,共有ways[n] 种不同的爬楼梯方法。
递归树求解递归方程
递归树求解递归方程递归树是一种用于求解递归方程的图形化工具。
递归方程是一种常见的数学模型,它描述了一个问题的解与其子问题的解之间的关系。
递归方程通常采用递归的方式定义,即将问题分解为更小的子问题,并通过子问题的解来求解原问题的解。
递归树可以帮助我们更好地理解递归方程的求解过程,从而更好地解决问题。
递归树的构建过程通常分为以下几个步骤:1. 将递归方程转化为递归树的形式。
递归方程通常描述了一个问题的解与其子问题的解之间的关系,而递归树则将这种关系以图形化的方式表示出来。
递归树的节点表示问题的解,而边表示问题的分解过程。
2. 根据递归方程的定义,确定递归树的根节点和子节点。
递归方程通常采用递归的方式定义,即将问题分解为更小的子问题,并通过子问题的解来求解原问题的解。
因此,递归树的根节点表示原问题的解,而子节点表示子问题的解。
3. 根据递归方程的定义,确定递归树的深度和宽度。
递归方程通常描述了一个问题的解与其子问题的解之间的关系,因此递归树的深度和宽度取决于问题的分解方式。
例如,如果问题的分解方式是将问题分解为两个子问题,则递归树的深度为2,宽度为2。
4. 根据递归方程的定义,确定递归树的叶节点。
递归方程通常描述了一个问题的解与其子问题的解之间的关系,因此递归树的叶节点表示子问题的解。
叶节点通常是递归树中最底层的节点,也是递归方程的基本情况。
通过递归树,我们可以更好地理解递归方程的求解过程。
例如,对于递归方程T(n) = 2T(n/2) + n,我们可以构建如下的递归树:```T(n)|/---------\T(n/2) T(n/2)| |/-----\ /-----\T(n/4) T(n/4) T(n/4) T(n/4)| | | |... ... ... ...| | | |T(1) T(1) T(1) T(1)```从递归树中可以看出,递归方程的求解过程可以分为两个阶段。
在第一阶段中,递归树的深度为logn,每个节点的代价为n。
算法_求解递归方程的方法
.专业整理..学习帮手.第二章 常用的数学工具2.2 用生成函数求解递归方程 2.2.1 生成函数及其性质一、生成函数的定义定义2.1 令Λ,,,210a a a 是一个实数序列,构造如下的函数:k k kz az a z a a z G ∑∞==+++=02210)(Λ (2.2.1)则函数)(z G 称为序列Λ,,,210a a a 的生成函数。
例:函数nn n n n n n x C x C x C C x ++++=+Λ2210)1(则函数n x )1(+便是序列nn n n n C C C C ,,,,210Λ的生成函数。
二、生成函数的性质1. 加法 设k k k z a z G ∑∞==0)(是序列Λ,,,210a a a 的生成函数,k k kz bz H ∑∞==)(是序列Λ,,,210b b b 的生成函数,则)()(z H z G βα+k k kkk kz bz az H z G ∑∑∞=∞=+=+0)()(βαβαk k k kz b a)(0∑∞=+=βα(2.2.2).专业整理..学习帮手.是序列Λ,,,221100b a b a b a βαβαβα+++的生成函数。
2.移位 设k k k z a z G ∑∞==0)(是序列Λ,,,210a a a 的生成函数,则)(z G z mkmk m k mzaz G z ∑∞=-=)( (2.2.3)是序列ΛΛ,,,,0,,0210a a a 的生成函数。
3.乘法 设k k k z a z G ∑∞==0)(是序列Λ,,,210a a a 的生成函数,k k kz bz H ∑∞==)(是序列Λ,,,210b b b 的生成函数,则)()(z H z G)()()()(22102210ΛΛ++++++=z b z b b z a z a a z H z GΛ++++++=2021120011000)()(z b a b a b a z b a b a b ak k k z c ∑∞==0(2.2.4)是序列Λ,,,210c c c 的生成函数,其中,k n nk k n b a c -=∑=04. z 变换 设k k k z a z G ∑∞==0)(是序列Λ,,,210a a a 的生成函数,则)(z c GΛ++++=332210)()()()(z c a z c a z c a a z c GΛ++++=33322210z a c z a c z a c a (2.2.5).专业整理..学习帮手.是序列Λ,,,2210a c a c a 的生成函数。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目录递归方程组解的渐进阶的求法——代入法 (11)递归方程组解的渐进阶的求法——迭代法 (14)递归方程组解的渐进阶的求法——套用公式法 (17)递归方程组解的渐进阶的求法——差分方程法 (3)递归方程组解的渐进阶的求法——母函数法 (7)递归方程解的渐近阶的求法递归方程组解的渐进阶的求法——套用公式法这个方法为估计形如:T(n)=aT(n/b)+f(n) (6.17)的递归方程解的渐近阶提供三个可套用的公式。
(6.17)中的a≥1和b≥1是常数,f (n)是一个确定的正函数。
(6.17)是一类分治法的时间复杂性所满足的递归关系,即一个规模为n的问题被分成规模均为n/b的a个子间题,递归地求解这a个子问题,然后通过对这a个子间题的解的综合,得到原问题的解。
如果用T(n)表示规模为n的原问题的复杂性,用f(n)表示把原问题分成a个子问题和将a个子问题的解综合为原问题的解所需要的时间,我们便有方程(6.17)。
这个方法依据的是如下的定理:设a≥1和b≥1是常数f (n)是定义在非负整数上的一个确定的非负函数。
又设T(n)也是定义在非负整数上的一个非负函数,且满足递归方程(6.17)。
方程(6.17)中的n/b可以是[n/b],也可以是n/b。
那么,在f(n)的三类情况下,我们有T(n)的渐近估计式:1. 若对于某常数ε>0,有,则;2. 若,则;3. 若对其常数ε>0,有且对于某常数c>1和所有充分大的正整数n有af(n/b)≤cf(n),则T(n)=θ(f(n))。
这里省略定理的证明。
在应用这个定理到一些实例之前,让我们先指出定理的直观含义,以帮助读者理解这个定理。
读者可能已经注意到,这里涉及的三类情况,都是拿f(n)与作比较。
定理直观地告诉我们,递归方程解的渐近阶由这两个函数中的较大者决定。
在第一类情况下,函数较大,则T(n)=θ();在第三类情况下,函数f(n)较大,则T(n)=θ(f (n));在第二类情况下,两个函数一样大,则T(n)=θ(),即以n的对数作为因子乘上f(n)与T(n)的同阶。
此外,定理中的一些细节不能忽视。
在第一类情况下f(n)不仅必须比小,而且必须是多项式地比小,即f(n)必须渐近地小于与的积,ε是一个正的常数;在第三类情况下f(n)不仅必须比大,而且必须是多项式地比大,还要满足附加的“正规性”条件:af(n/b)≤cf(n)。
这个附加的“正规性”条件的直观含义是a个子间题的再分解和再综合所需要的时间最多与原问题的分解和综合所需要的时间同阶。
我们在一般情况下将碰到的以多项式为界的函数基本上都满足这个正规性条件。
还有一点很重要,即要认识到上述三类情况并没有覆盖所有可能的f(n)。
在第一类情况和第二类情况之间有一个间隙:f(n)小于但不是多项式地小于;类似地,在第二类情况和第三类情况之间也有一个间隙:f(n)大于但不是多项式地大于。
如果函数f(n)落在这两个间隙之一中,或者虽有,但正规性条件不满足,那么,本定理无能为力。
下面是几个应用例子。
例1考虑T(n)=9T(n/3)+n0对照(6.17),我们有a=9,b=3,f(n)=n,,取,便有,可套用第一类情况的公式,得T(n)=θ(n2)。
例2 考虑T(n)=T(2n/3)+1对照(6.17),我们有a=1,b=3/2,f(n)=1,,可套用第二类情况的公式,得T(n)=θ(logn)。
例3考虑T(n)=3T(n/4)+nlogn对照(6.17),我们有a=3,b=4,f(n)=nlog n,,只要取,便有。
进一步,检查正规性条件:只要取c=3/4,便有af(n/b)≤cf(n),即正规性条件也满足。
可套用第三类情况的公式,得T(n)=θ(f(n))=θ(nlogn)。
最后举一个本方法对之无能为力的例子。
考虑T(n)=2T(n/2)+n log n对照(6.17),我们有a=2,b=2,f(n)=n log n,,虽然f(n)渐近地大于,但f(n)并不是多项式地大于,因为对于任意的正常数ε,,即f(n)在第二类情况与第三类情况的间隙里,本方法对它无能为力。
递归方程组解的渐进阶的求法——差分方程法这里只考虑形如:T(n)=c1T(n-1)+c2T(n-2)+…+ c k T(n-k)+f(n),n≥k (6.18)的递归方程。
其中c i (i=l,2,…,k)为实常数,且c k≠0。
它可改写为一个线性常系数k阶非齐次的差分方程:T(n)-c1T(n-1)- c2T(n-2)-…-c k T(n-k)=f(n),n≥k (6.19)(6.19)与线性常系数k阶非齐次常微分方程的结构十分相似,因而解法类同。
限于篇幅,这里直接给出(6.19)的解法,略去其正确性的证明。
第一步,求(6.19)所对应的齐次方程:T(n)-c1T(n-1)- c2T(n-2)-…-c k T(n-k)=0 (6.20)的基本解系:写出(6.20)的特征方程:C(t)=t k-c1t k-1-c2t k-2 -…-c k=0 (6.21)若t=r是(6.21)的m重实根,则得(6.20)的m个基础解r n,nr n,n2r n,…,n m-1r n;若ρe iθ和ρe-iθ是(6.21)的一对l重的共扼复根,则得(6.20)的2l个基础解ρn cos nθ,ρn sin nθ,nρn cos nθ,nρn sin nθ,…,n l-1ρn cos nθ,n l-1ρn cos nθ。
如此,求出(6.21)的所有的根,就可以得到(6.20)的k个的基础解。
而且,这k个基础解构成了(6.20)的基础解系。
即(6.20)的任意一个解都可以表示成这k个基础解的线性组合。
第二步,求(6.19)的一个特解。
理论上,(6.19)的特解可以用Lagrange常数变易法得到。
但其中要用到(6.20)的通解的显式表达,即(6.20)的基础解系的线性组合,十分麻烦。
因此在实际中,常常采用试探法,也就是根据f(n)的特点推测特解的形式,留下若干可调的常数,将推测解代人(6.19)后确定。
由于(6.19)的特殊性,可以利用迭加原理,将f(n)线性分解为若干个单项之和并求出各单项相应的特解,然后迭加便得到f(n)相应的特解。
这使得试探法更为有效。
为了方便,这里对三种特殊形式的f(n),给出(6.19)的相应特解并列在表6-1中,可供直接套用。
其中p i,i=1,2,…,s是待定常数。
表6-1 方程(6.19)的常用特解形式f(n)的形条件方程(6.19)的特解的形式式C(a)≠0a na是C(t)的m重根n sC(1)≠01是C(t)的m重根n s a nC(a)≠0a是C(t)的m重根第三步,写出(6.19)即(6.18)的通解(6.22)其中{T i(n),i=0,1,2,…,n}是(6.20)的基础解系,g(n)是(6.19)的一个特解。
然后由(6.18)的初始条件T(i)=T i,i=1,2,…,k-1来确定(6.22)中的待定的组合常数{a i},即依靠线性方程组或解出{a i},并代回(6.22)。
其中βj=T j-g(j),j=0,1,2,…,k-1。
第四步,估计(6.22)的渐近阶,即为所要求。
下面用两个例子加以说明。
例l考虑递归方程它的相应特征方程为:C(t)=t2-t-1=0解之得两个单根和。
相应的(6.20)的基础解系为{r0n,r1n}。
相应的(6.19)的一个特解为F*(n)=-8,因而相应的(6.19)的通解为:F(n)=a0r0n +a1r1n- 8令其满足初始条件,得二阶线性方程组:或或解之得,,从而于是。
例2考虑递归方程T(n)=4T(n-1)-4T(n-2)+2n n (6.23)和初始条件T(0)=0,T(1)=4/3。
它对应的特征方程(6.21)为C(t)=t2-4t+4=0有一个两重根r =2。
故相应的(6.20)的基础解系为{2n,2n n}。
由于f(n)=2n n,利用表6-1,相应的(6.19)的一个特解为T*(n)=n2(p0+p1n)2n,代人(6.23),定出p0=1/2,p1=1/6。
因此相应的(6.19)的通解为:T(n)=a02n+a1n2n+n2(1/2+n/6)2n,令其满足初始条件得a0=a1=0,从而T(n)=n2(1/2+n/6)2n于是T(n)=θ(n32n)。
递归方程组解的渐进阶的求法——母函数法关于T(n)的递归方程的解的母函数通常设为:(6.24)当(6.24)右端由于T(n)增长太快而仅在x=0处收敛时可另设(6.25)如果我们可以利用递归方程建立A(x)的一个定解方程并将其解出,那么,把A(x)展开成幂级数,则x n或x n/n!项的系数便是所求的递归方程的解。
其渐近阶可接着进行估计。
下面举两个例子加以说明。
例1 考虑线性变系数二阶齐次递归方程(n-1)T(n)=(n-2)T(n-1)+2T(n-2) ,n≥2 (6.26)和初始条件T(0)=0,T(1)=1。
根据初始条件及(6.26),可计算T(2)=0,T(3)=T(1)=1。
设{T(n)}的母函数为:由于T (0)=T (2)=0,T(1)= 1,有:令B(x)= A (x)/x,即:那么:利用(6.26)并代入T (3)= 1,得即两边同时沿[0,x]积分,并注意到B(0)=1,有:把B(x)展开成幂级数,得从而最后得例2 考虑线性变系数一阶非齐次递归方程D(n)=nD(n-1)+(-1)n n≥1 (6.27)及初始条件D (0)= 1很明显D(n)随n的增大而急剧增长。
如果仍采用(6.24)形式的函数,则(6.24)的右端可能仅在x=0处收敛,所以这里的母函数设为:用x n/n!乘以(6.27)的两端,然后从1到∞求和得:化简并用母函数表达,有:A(x) -1= xA(x)+e-x-1或(1-x)A(x)=e-x从而A(x)=e-x/(1-x)展成幂级数,则:故递归算法在最坏情况下的时间复杂性渐近阶的分析,都转化为求相应的一个递归方程的解的渐近阶。
因此,求递归方程的解的渐近阶是对递归算法进行分析的关键步骤。
递归方程的形式多种多样,求其解的渐近阶的方法也多种多样。
这里只介绍比较实用的五种方法。
1.代入法这个方法的基本步骤是先推测递归方程的显式解,然后用数学归纳法证明这一推测的正确性。
那么,显式解的渐近阶即为所求。
2.迭代法这个方法的基本步骤是通过反复迭代,将递归方程的右端变换成一个级数,然后求级数的和,再估计和的渐近阶;或者,不求级数的和而直接估计级数的渐近阶,从而达到对递归方程解的渐近阶的估计。
3.套用公式法这个方法针对形如:T (n)=aT (n / b)+f (n) 的递归方程,给出三种情况下方程解的渐近阶的三个相应估计公式供套用。