递归及递归算法分析.

Slides:



Advertisements
Similar presentations
一、 一阶线性微分方程及其解法 二、 一阶线性微分方程的简单应用 三、 小结及作业 §6.2 一阶线性微分方程.
Advertisements

第五节 全微分方程 一、全微分方程及其求法 二、积分因子法 三、一阶微分方程小结. 例如 所以是全微分方程. 定义 : 则 若有全微分形式 一、全微分方程及其求法.
第二章 导数与微分 习题课 主要内容 典型例题 测验题. 求 导 法 则求 导 法 则 求 导 法 则求 导 法 则 基本公式 导 数 导 数 微 分微 分 微 分微 分 高阶导数 高阶微分 一、主要内容.
2.8 函数的微分 1 微分的定义 2 微分的几何意义 3 微分公式与微分运算法则 4 微分在近似计算中的应用.
第八章 第四节 机动 目录 上页 下页 返回 结束 一个方程所确定的隐函数 及其导数 隐函数的微分法.
常系数线性微分方程组 §5.3 常系数线性方程组. 常系数线性微分方程组 一阶常系数线性微分方程组 : 本节主要讨论 (5.33) 的基解矩阵的求法.
2.6 隐函数微分法 第二章 第二章 二、高阶导数 一、隐式定义的函数 三、可微函数的有理幂. 一、隐函数的导数 若由方程 可确定 y 是 x 的函数, 由 表示的函数, 称为显函数. 例如, 可确定显函数 可确定 y 是 x 的函数, 但此隐函数不能显化. 函数为隐函数. 则称此 隐函数求导方法.
2.5 函数的微分 一、问题的提出 二、微分的定义 三、可微的条件 四、微分的几何意义 五、微分的求法 六、小结.
第二章 导数与微分 一. 内 容 要 点 二. 重 点 难 点 三. 主 要 内 容 四. 例 题与习题.
第二章 导数与微分. 二、 微分的几何意义 三、微分在近似计算中的应用 一、 微分的定义 2.3 微 分.
练一练: 在数轴上画出表示下列各数的点, 并指出这些点相互间的关系: -6 , 6 , -3 , 3 , -1.5, 1.5.
圆的一般方程 (x-a)2 +(y-b)2=r2 x2+y2+Dx+Ey+F=0 Ax2+Bxy+Cy2+Dx+Ey+ F=0.
第五章 二次型. 第五章 二次型 知识点1---二次型及其矩阵表示 二次型的基本概念 1. 线性变换与合同矩阵 2.
一、二阶行列式的引入 用消元法解二元线性方程组. 一、二阶行列式的引入 用消元法解二元线性方程组.
5.3 二阶微分方程 主要内容 1.可降阶的二阶微分方程 2.二阶常系数线性微分方程.
计算学科的基本问题 本章首先介绍一个对问题进行抽象的典型实例——哥尼斯堡七桥问题。然后,通过“梵天塔”问题和“停机问题”分别介绍学科中的可计算问题和不可计算问题。从“梵天塔”问题再引出算法复杂性中的难解性问题、P类问题和NP类问题,证比求易算法,P=NP是否成立的问题。
第三章 微分方程和差分方程模型 3.1 微分方程模型 3.2 差分方程模型 3.3 观众厅地面设计 3.4 碳定年代法
第三章 函数逼近 — 最佳平方逼近.
算法设计与分析 第二章 递归与分治策略 杨圣洪.
《高等数学》(理学) 常数项级数的概念 袁安锋
第一章 行列式 第五节 Cramer定理 设含有n 个未知量的n个方程构成的线性方程组为 (Ⅰ) 由未知数的系数组成的n阶行列式
一、原函数与不定积分 二、不定积分的几何意义 三、基本积分公式及积分法则 四、牛顿—莱布尼兹公式 五、小结
第四章 定积分及其应用 4.3 定积分的概念与性质 微积分基本公式 定积分的换元积分法与分部积分法 4.5 广义积分
第四章 函数的积分学 第六节 微积分的基本公式 一、变上限定积分 二、微积分的基本公式.
第5章 定积分及其应用 基本要求 5.1 定积分的概念与性质 5.2 微积分基本公式 5.3 定积分的换元积分法与分部积分法
第四节 一阶线性微分方程 线性微分方程 伯努利方程 小结、作业 1/17.
第二章 导数与微分 第二节 函数的微分法 一、导数的四则运算 二、复合函数的微分法.
第三章 导数与微分 习 题 课 主要内容 典型例题.
第2章 Z变换 Z变换的定义与收敛域 Z反变换 系统的稳定性和H(z) 系统函数.
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
第六讲栈和队列(一)增加 1/13.
Cyclic Hanoi问题 李凯旭.
§2 求导法则 2.1 求导数的四则运算法则 下面分三部分加以证明, 并同时给出相应的推论和例题 .
第一章 函数 函数 — 研究对象—第一章 分析基础 极限 — 研究方法—第二章 连续 — 研究桥梁—第二章.
动态规划(Dynamic Programming)
第一章 函数与极限.
数列.
专题作业.
Partial Differential Equations §2 Separation of variables
线 性 代 数 厦门大学线性代数教学组 2019年4月24日6时8分 / 45.
11.1 递归的定义 11.2 常见递归问题 11.3 递归的实现 11.4 递归转化为非递归的一般过程 11.5 递归的时间和空间复杂度
离散数学─归纳与递归 南京大学计算机科学与技术系
复习.
1、递归的概念 2、递归函数的设计 3、递归过程与递归工作栈 4、例 5、递归过程的非递归化
正切函数的图象和性质 周期函数定义: 一般地,对于函数 (x),如果存在一个非零常数T,使得当x取定义域内的每一个值时,都有
第16讲 相似矩阵与方阵的对角化 主要内容: 1.相似矩阵 2. 方阵的对角化.
§8.3 不变因子 一、行列式因子 二、不变因子.
§6.7 子空间的直和 一、直和的定义 二、直和的判定 三、多个子空间的直和.
1.2 子集、补集、全集习题课.
1.设A和B是集合,证明:A=B当且仅当A∩B=A∪B
第一节 不定积分的概念与性质 一、原函数与不定积分的概念 二、不定积分的几何意义 三、基本积分表 四、不定积分的性质 五、小结 思考题.
第三章 函数的微分学 第二节 导数的四则运算法则 一、导数的四则运算 二、偏导数的求法.
4) 若A可逆,则 也可逆, 证明: 所以.
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
学习任务三 偏导数 结合一元函数的导数学习二元函数的偏导数是非常有用的. 要求了解二元函数的偏导数的定义, 掌握二元函数偏导数的计算.
一元二次不等式解法(1).
第15讲 特征值与特征向量的性质 主要内容:特征值与特征向量的性质.
2019/5/20 第三节 高阶导数 1.
第二节 函数的极限 一、函数极限的定义 二、函数极限的性质 三、小结 思考题.
正弦、余弦函数的性质 华容一中 伍立华 2017年2月24日.
第四节 第七章 一阶线性微分方程 一、一阶线性微分方程 *二、伯努利方程.
§2 方阵的特征值与特征向量.
φ=c1cosωt+c2sinωt=Asin(ωt+θ).
定义5 把矩阵 A 的行换成同序数的列得到的矩阵,
5.2.1 变量可分离的微分方程 形如 的微分方程成为变量可 分离的微分方程. 解法 分离变量法 5.2 一阶微分方程(80)
第四章 函数的 积分学 第七节 定积分的换元积分法     与分部积分法 一、定积分的换元积分法 二、定积分的分部积分法.
离散数学─归纳与递归 南京大学计算机科学与技术系
一元一次方程的解法(-).
§2 自由代数 定义19.7:设X是集合,G是一个T-代数,为X到G的函数,若对每个T-代数A和X到A的函数,都存在唯一的G到A的同态映射,使得=,则称G(更严格的说是(G,))是生成集X上的自由T-代数。X中的元素称为生成元。 A变, 变 变, 也变 对给定的 和A,是唯一的.
Cfc Zeilberger 算法 陈焕林 陈永川 付梅 臧经涛 2009年7月29日.
Presentation transcript:

递归及递归算法分析

主要内容 递归的实现机制 递归算法编制 递归关系式求解

递归的实现机制 1.递归的概念 直接或间接地调用自身的算法称为递归算法。 用函数自身给出定义的函数称为递归函数。 直接调用自身的算法称为直接递归 间接调用自身的算法称为间接递归

由分治法产生的子问题往往是原问题的较小模式,这就为使用递归技术提供了方便。在这种情况下,反复应用分治手段,可以使子问题与原问题类型一致而其规模却不断缩小,最终使子问题缩小到很容易直接求出其解。这自然导致递归过程的产生。 分治与递归像一对孪生兄弟,经常同时应用在算法设计之中,并由此产生许多高效算法。

2.子程序的内部实现原理 1)子程序调用的一般形式 一次调用 N次调用 嵌套调用 平行调用 主程序 call A 1: 主程序 call A 2: 主程序 call A 1: 主程序 call B 1: 子程序A 子程序A 子程序B call B 2: 子程序A 子程序A 子程序B call A 2:

2)值的回传 实参和形参的数据传递 值的回传通常有两种形式: 传值 实参的值不发生改变 传地址 实参的值发生改变 传值 实参的值不发生改变 传地址 实参的值发生改变 值的回传通常有两种形式: 两次传值方式:按照指定类型为变参设置相应的存储空间,在执行调用时,将实参值传送给变参在返回时将变参的值传给实参。 传地址:在内部将变参用一个地址替换,调用时,先执行地址传送,将实参地址传送给变参,在执行过程中,对变参的操作实际变成对实参的操作。 实参 变参 1 2 实参 变参 X 地址X

3)子程序调用的内部操作 执行调用时,系统完成的操作 返回时,系统完成的操作: 返回地址进栈,为子程序的局部变量开辟空间 为子程序准备数据:计算实参值,并将其值送给形参 转入子程序入口地址 返回时,系统完成的操作: 变参或函数的值保存到回传变量中 从栈顶取返回地址 返回调用程序 将回传变量的值送给实参

3.递归过程的内部实现原理 程序A if 出口条件 then 简单语句 else 简单语句;call A ; 1:简单语句; endif endA 递归程序的执行令人担心是否引发死循环。担心是多余的! 因为每次调用,必有一些数据发生变化,直到出现一组数据终止递归。这组数据就是递归出口。 执行到出口条件 开始出栈 1 。。。

递归举例 间接递归 proc p1(n){ if n>0 then 直接递归 if odd(n) then p1(n-1); print n; else p2(n-1);print n; } proc p2(n){ if n>0 then if n mod 3==0 then p1(n-1) else p2(n-1) 直接递归 proc fact(n) if n=0 then return 1 else return n*fact(n-1)

递归函数举例 例1 阶乘函数 阶乘函数可递归地定义为: 边界条件 递归方程 例1 阶乘函数 阶乘函数可递归地定义为: 边界条件 递归方程 边界条件与递归方程是递归函数的二个要素,递归函数只有具备了这两个要素,才能在有限次计算后得出结果。

递归函数举例 例2 Fibonacci数列 无穷数列1,1,2,3,5,8,13,21,34,55,…,被称为Fibonacci数列。它可以递归地定义为: 边界条件 递归方程 第n个Fibonacci数可递归地计算如下: public static int fibonacci(int n) { if (n <= 1) return 1; return fibonacci(n-1)+fibonacci(n-2); }

递归函数举例 例3 Ackerman函数 当一个函数及它的一个变量是由函数自身定义时,称这个函数是双递归函数。 Ackerman函数A(n,m)定义如下:

前2例中的函数都可以找到相应的非递归方式定义: 例3 Ackerman函数 前2例中的函数都可以找到相应的非递归方式定义: 但本例中的Ackerman函数却无法找到非递归的定义。

例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 。 M=3时,类似的可以推出 M=4时,A(n,4)的增长速度非常快,以至于没有适当的数学式子来表示这一函数。

例3 Ackerman函数 定义单变量的Ackerman函数A(n)为,A(n)=A(n,n)。 定义其逆函数α(n)为:α(n)=min{k|A(k)≥n}。即α(n)是使n≤A(k)成立的最小的k值。 α(n)在复杂度分析中常遇到。对于通常所见到的正整数n,有α(n)≤4。但在理论上α(n)没有上界,随着n的增加,它以难以想象的慢速度趋向正无穷大。

N! 例4 排列问题 设计一个递归算法生成n个元素{r1,r2,…,rn}的全排列。 例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)构成。 N!

r1---t(1)=1 r1、r2---------r1perm(R1) r2perm(R2) t(2)=2*t(1) r1、r2、r3 r1perm(R1) r2perm(R2) r3perm(R3) t(3)=3*T(2) …………….. t(n)=n*t(n-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。

前面的几个例子中,问题本身都具有比较明显的递归关系,因而容易用递归函数直接求解。 在本例中,如果设p(n)为正整数n的划分数,则难以找到递归关系,因此考虑增加一个自变量:将最大加数n1不大于m的划分个数记作q(n,m)。可以建立q(n,m)的如下递归关系。 ?

正整数n的划分由n1=n的划分和n1≤n-1的划分组成。 (1) q(n,1)=1,n1; 当最大加数n1不大于1时,任何正整数n只有一种划分形式, 即 (2) q(n,m)=q(n,n),mn; 最大加数n1实际上不能大于n。因此,q(1,m)=1。 (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 的划分组成。 不包含m 包含m的划分

递归算法设计 用递归求解问题的3个要求: proc f(参数表) if 递归出口 then 简单语句; 问题的描述涉及规模 规模发生变化后,问题性质不改变 问题的解决有出口 proc f(参数表) if 递归出口 then 简单语句; else 简单语句;call f(参数表);简单语句; endif endf

例6 Hanoi塔问题 设a,b,c是3个塔座。开始时,在塔座a上有一叠共n个圆盘,这些圆盘自下而上,由大到小地叠在一起。各圆盘从小到大编号为1,2,…,n,现要求将塔座a上的这一叠圆盘移到塔座b上,并仍按同样顺序叠置。在移动圆盘时应遵守以下移动规则: 规则1:每次只能移动1个圆盘; 规则2:任何时刻都不允许将较大的圆盘压在较小的圆盘之上; 规则3:在满足移动规则1和2的前提下,可将圆盘移至a,b,c中任一塔座上。

例6 Hanoi塔问题 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时,问题比较简单。此时,只要将编号为1的圆盘从塔座a直接移至塔座b上即可。 当n>1时,需要利用塔座c作为辅助塔座。此时若能设法将n-1个较小的圆盘依照移动规则从塔座a移至塔座c,然后,将剩下的最大圆盘从塔座a移至塔座b,最后,再设法将n-1个较小的圆盘依照移动规则从塔座c移至塔座b。 由此可见,n个圆盘的移动问题可分为2次n-1个圆盘的移动问题,这又可以递归地用上述方法来做。由此可以设计出解Hanoi塔问题的递归算法如下。 思考题:如果塔的个数变为a,b,c,d四个,现要将n个圆盘从a全部移动到d,移动规则不变,求移动步数最小的方案。

n=3 t(3)=7 n=4 t(4)=15 n=10 t(10)=1023 n=16 t(16)=65534

递归小结 优点:结构清晰,可读性强,而且容易用数学归纳法来证明算法的正确性,因此它为设计算法、调试程序带来很大方便。 缺点:递归算法的运行效率较低,无论是耗费的计算时间还是占用的存储空间都比非递归算法要多。

递归算法的时间复杂度分析 递归函数求解 简单递归式求解 master method 递推方程的特征方程求解

T(n)=2n-1 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); } T(n)=2T(n-1)+O(1) n≥1 0 n=0 T(n)=2n-1 4

简单递归式的求解 1.T(n)=T(n-1)+c1 n>1 c2 n=1 2. T(n)=2T(n/2)+c1 n ≥2 3. T(n)=2T(n/2)+Θ(n) n ≥2 O(1) n<2

T( n/2 ) + T( n/2 ) + 1 (n > 1) 例1 T(n) = 0 (n = 1) 令2r=n =2rT(1)+2r-1+。。。+2+1 =(1-2r)/(1-2)=n-1 ∴ T( n ) = n - 1

例2 递推关系式: 3 T( n/2 ) + k n (n > 1) k ( n = 1) T (n ) = 解上述递推式: T( n ) = 3 T( n/2 ) + k n = 3 [ 3 T( n/22 ) + k (n / 2 ) ] + k n =32T(n/22)+3k(n/2)+kn =       =3rT(n/2r)+(3/2)r-1kn+….+kn =3rk+ (3/2)r-1kn+….+kn = 3 r+1  k - 2 k n = 3 k 3log2n - 2 k n  3 k n 1.59 - 2 k n = O( n 1. 59 )

例3 T( n/2 ) + T( n/2 ) + (n - 1) (n > 1) T(n) = 0 (n = 1) 设:n = 2r ( r:非负整数)。 有:T(n) = 2 T(n/2 ) + ( n - 1 ) 2 22 2 T(n/2) = 2 T(n/22 ) + (n/2 - 1) 22 23 + 22 T(n/22) = 2 T(n/23 ) + (n/22 - 1)       T(n/2r-1) = 2 T(n/2r ) + (n/2r-1 - 1) 2r-1 2r 2r-1 +) T( n ) = 2r T(1) + rn - (2r-1 + 2r-2 +    +20) = nlog2n - n +1 = O(nlog n)

Master Method T(n)=aT(n/b)+f(n) a≥1b>1 f(n)是一个非负渐进函数 case1:Ǝ Ɛ>0,使f(n)=O(nlog ba-Ɛ) 即0<f(n)<nlog ba-Ɛ 则T(n)=Θ(nlog ba) case2:Ǝ k≥0,使f(n)= Θ(nlog balgnk) 则T(n)=Θ(nlog balgnk+1) case1:Ǝ Ɛ>0,c>0,使f(n)= Ω(nlog ba+Ɛ) ,af(n/b)<cf(n) 则T(n)=Θ(f(n))

例1 T(n)=4T(n/2)+n a=4 b=2 f(n)=O(n2-Ɛ)取Ɛ=1 则T(n)=Θ(n2) 例2 T(n)=4T(n/2)+n2 a=4 b=2 f(n)= Θ(n2lgnk)取K=0 则T(n)=Θ(n2lgn) 例3 T(n)=4T(n/2)+n3 a=4 b=2 f(n)=n3= Ω(nlog ba+Ɛ)取Ɛ=1 且4f(n/2)=n3/2<n3 取c=1 则T(n)=Θ(n3)

递推方程的特征方程求解 一、常系数线性递推方程的特征方程解法 1. 齐次常系数线性递推方程的特征方程解法 (1)定义:k阶齐次常系数线性递推方程: (R): H(n) = a1H(n - 1) + a2H(n - 2) +   +akH(n - k) 其中: 1)a1, a2,    , ak为常数; 2)ak  0, n  k。 (2)定义:(R)对应的特征方程: (E): xk - a1x k - 1 - a2 x k - 2 -    - a k-1 x - ak = 0

(3) (R)的通解 1)若(E)有k个互不同的实根x1, x2,    , xk, 则(R) 的通 解是:H(n) = c1x1n + c2 x2n +    + ck xkn 其中: c1, c2 、  、ck 是常数,它由H(n)的初始条件确定(下同)。 2)若(E)存在e重根xp(e  2 ),即:(E)的根是: x1, x2,    x k-e, xp, xp,   , xp 共有e个 则(R)的通解是: H(n) = c1x1n + c2 x2n +    + ck-e xk-en + c k-e+1xpn + c k-e+2 n xpn +    + ck ne-1 xpn

3)若(E)有一对共轭虚根 x 1,2 = ( cos  i sin ) ,则: (R)的通解: T(n) = c1n cos n + c2 nsin n 例 求Fibonacci序列的Fn F(n - 1) + F(n - 2) (n > 1) F(n) = 1 ( n = 1) 0 ( n = 0)

解:(R): F(n) = F(n -1) + F(n - 2) (E): x2 - x - 1 = 0 (E)的根: x1 = 1/2 + 52 , x2 = 1/2 - 52 因为 x1  x2 所以 F(n) = c1(1/2 + 52)n +c2 (1/2 - 52)n 由 F(0) = 0 和F(1) = 1 知: C1 = 1/ 5 C2 = - 1/ 5 c1 + c2 = 0 c1( 1/2 + 52 ) + c2(1/2 - 52 ) = 1 F(n) = 1/ 5 [ (1/2 + 52)n - (1/2 - 52)n ]

(1/2 - 3/3)( 1 - 3)n 2 T( n - 1) + 2 T( n - 2 ) ( n > 2 ) (R): T( n ) = 2 T( n - 1) + 2 T( n - 2 ) (E): x2 - 2x - 2 = 0 x1 = 1 + 3, x2 = 1 - 3 因为:x1  x2 T(n) = c1(1 + 3)n + c2( 1 - 3)n 由:T(1) = 3 和 T(2) = 8 得: c1 = 1/2 + 3/3, c2 = 1/2 - 3/3, 故:T(n) = (1/2 + 3/3)(1 + 3)n + (1/2 - 3/3)( 1 - 3)n

对(3)递推:Sn-1 - Sn-2 = (n - 1)2 (4)  K2 k = 0 n 解:由: Sn = 12 + 22 +  + n2 (1) 递推:S n-1 = 12 + 22 +  +(n - 1)2 (2) 由(1)- (2) 得:Sn - S n-1 = n2 (3) 对(3)递推:Sn-1 - Sn-2 = (n - 1)2 (4) 由(3) - (4) 得:Sn - 2S n-1 + S n-2 = 2n - 1 反复使用上面的方法,消去等号右边多项式,得: S n - 4Sn-1 + 6Sn-2 - 4Sn-3 + Sn-4 = 0 (R) (E): x4-4x3+6x2-4x+1=0 ---------(x - 1) 4 = 0 x1 = x2 = x3 = x4 = 1 5

因为特征方程的解是四重根,所以: Sn = c11n +c2 n 1n + c3 n2 1n + c4 n3 1n = c1 + c2n + c3n2 + c4n3 由: S0 = 0, S1 = 1, S2 = 5, S3 = 14, 知: c1 = 0 , c2 = 1/6, c3 = 1/2, c4 = 1/3 所以:Sn = 1/6 n ( n + 1 ) (2 n + 1 )

2 非齐次常系数线性递推方程的特征方程解法 (1)定义:(R’)为k阶非齐次常系数线性递推方程: (R’): H(n) = a1H(n - 1)+a2H(n - 2)+   +akH(n - k)+f(n) 其中: 1)a1, a2,    , ak为常数; 2)ak  0, n  k, f(n)  0。 (2)(R’)的解结构: 设:(R’)的通解是H(n),且它有一个特解H*(n); 而与(R’)相对应的 齐次方程(R)的通解是H’(n)。 则有(R’)的解:H(n) = H’(n) + H*(n)

(3) (R’)的特解形式讨论 1)当f(n) 形如bnt( b0, t:非负整数)时,(R’)的特解为: H*(n) = p1nt + p2nt-1+  + pt n + pt+1 其中:p1, p2, , pt+1是待定系数。 但,当x = 1是(R)的 j 重特征根(j  1)时,其特解应 改设为: H*(n) = p1nt+j + p2nt-1+j+  + pt+1nj 2)当f(n) 形如 b  rn( b0, r 0 )时,(R’)的特解为: H*(n) = p rn 其中:p是待定系数。 但,当 x = r 是(R’) 对应的(R)的 j 重特征根( j  1)时, (R’)的特解应改设为: H*(n) = p  nj  rn

2T( n - 1 ) + k (n > 1) (k:正数) 解:(R’) : T(n) = 2T(n - 1) + k (R) : T(n) = 2T(n - 1) (E): x - 2 = 0 x = 2 (R)的通解: T(n) = c 2n 因为(R’)中,f(n) = k 所以, 设: T*(n) = p 显然, T*(n - 1) = p

把T*(n)、T*(n - 1)代入(R’) , 有:p = 2p + k p = - k 故:T*(n) = - k (R’)的通解:T(n) = T’(n) + T*(n) = c 2n - k 由T(1) = k, 把它代入上式, 有:2 c - k = k c = k (R’)的通解:T(n) = k( 2n - 1) = O( 2n )

2n-3 - T( n -2 ) ( n > 4 ) 例 T(n) = 1 ( n = 3 ) 2 ( n = 4 ) 解:(R’): T(n) = - T(n - 2 ) + 2n-3 (R): T(n) = - T(n - 2 ) (E): x2 + 1 = 0 (R) 的通解:T’(n) = c1cos(n/2) + c2sin(n/2) ( 其中: = 1,  = /2)

设:(R’) 的特解是:T*(n) = p 2n 把它代入(R’),有:p 2n = - p 2 n-2 + 2 n-3 得:p = 1/10  T(n) = c1cos(n/2) + c2sin(n/2) + 2n/10 由:T(3) = 1 和 T(4) = 2, 知:c1 = 2/5, c2 = -1/5 故: T(n) = 2/5cos(n/2) - 1/5sin(n/2) + 2n/10 ( n > 2 )

例 再求:Sn =  K2 k = 0 n 解:由: Sn = 12 + 22 +  + n2 (1) 递推:S n-1 = 12 + 22 +  +(n - 1)2 (2) 由(1)- (2) 得:Sn - S n-1 = n2 (R’) (R): Sn - S n-1 = 0 (E): x - 1 = 0 x = 1 (R)的通解:S’n = c 设:(R’)的特解是:S*n = p1n3 + p2n2 + p3n 代入(R’), 得:p1 = 1/3, p2 = 1/2, p3 = 1/6 (R’)的通解:Sn = p1n3 + p2n2 + p3n + c 由S0 = 0,知:c = 0 故: Sn = p1n3 + p2n2 + p3n

原则:“变换”。 变系数/非线性递推方程的求解 一、变“非线性”为“线性” 例 求H(n)。已知: H2(n) - 2H2(n - 1) = 1 ( H(n) > 0 , n > 0 ) 解:令:G(n) = H2(n),则有: G(n) - 2G(n - 1) = 1 ( G(n) > 0, n > 0 ) G(0) = 4 解上述递推式,得:G(n) =5 2n - 1 H(n) = 52n - 1

二、变“变系数”为“常系数” b (n = 1; b:非负常数) (n - 1) +  1/n T(k - 1) +  1/nT(n-k) (n > 1) k=1 n T(n) =

整理、改写上述递推式: T(n) = (n - 1) + 2/n  T(k) n-1 k=1 nT(n) = n(n - 1) + 2  T(k) n-1 k=1 (1) (n-1)T(n-1) = (n-1)(n - 2) + 2  T(k) n-2 k=1 (2) 递推: 由(1) - (2) 得: nT(n) - (n - 1)T(n - 1) = 2(n - 1) + 2T(n - 1) 即: T(n) = T(n - 1) + n+1 1 n 2(n - 1) n(n + 1) (3) 令:Q(n) = T(n), 有:Q(n - 1) = T(n - 1) n+1 1 n

代入(3)式:Q(n) = Q(n - 1) + n(n + 1) 2(n - 1) 递推:Q(n - 1) = Q(n - 2) + (n - 1)n 2(n - 2) Q(n - 2) = Q(n - 3) + (n - 2)(n - 1) 2(n - 3)  Q(2) = Q(1) + 2  1 2  3 +) Q(n) - Q(1) =  n k=2 k(k + 1) 2(k - 1)  k=2 n = k+1 4 - k 2 = n+1 4 - 1 + 2  k=3 n k

因为:  k=3 n k 1   3 x dx = ln n - ln 3 由:Q(n) = T(n), 及:T(1) = b, 知:Q(1) = 1/2b n+1 1 T(n) = (n + 1) Q(n)  2(n + 1) ln n + (b/2 - 1 - 2ln 3)(n +1) + 4 = O(n ln n)

递归程序的阅读法 用图形方式描述执行轨迹 按次序写出程序在当前调用层上实际执行的语句,并用有向弧表明语句执行次序 对程序中的每个调用语句写出实际调用形式,在其下(右)边写出本次调用的子程序实际执行的语句,用有向弧指示。 被调用子程序执行完有向弧指向其上级(标上形参的值) 变参:再返回路线上增加语句实参=变参 函数: 实参=函数值 最后,顺着有向弧的路径写出结果。

例 proc f(w) if w>0 then { f(w-1) print w f(w-1) } end f

习题答案  1. 用递推法求解 T(n/2) + b n log2 n (n > 1) T(n) = b (n = 1) (b:正数) T(n/2) + b n log2 n (n > 1) T(n) = 1. 用递推法求解 答:T(n) = 2b • nlog2n - 2b • n + 3b = O(nlog2n) 2. 求解:T(n)= aT(n/c) + bn (n > 1) b (n = 1) (a, c:正整数;b:正数) 答:当 n = cr(r:非负整数)时,有 T(n) = (bn) ki (k = a/c) i=0 logc n 

(1) 当 a<c 时, 因为 ki 收敛于一个常数, T(n) = O(n) (2) 当 a=c 时, T(n) = bn(r+1) = bn (logcn + 1) = O(n log n) (3) 当 a>c 时, T(n) = bn • (kr+1 - 1) / (k-1) = bk / (k - 1) • ar - bn / (k - 1) = bk/(k - 1) • alogcn - bn/(k - 1) = O ( nlogca ) 用特征方程法求解T(n)。已知: 2 T(n - 1) + n (n > 1) 1 (n = 1) (1)T(n) = 答:T(n) = 2n+1 - ( n + 2 )

7T(n – 1) - 12T(n – 2) + 3n (n > 1) 0 (n = 0) 4. 试证:当特征方程(E)包含有二重根 x 1,2 = xp 时,齐次方程(R)通解包含有:T(n)= c1xpn + c2 n xpn 证:设:齐次常系数线性递推方程如下: H(n) = a1H(n-1) + a2H(n-2) + •••••• +akH(n-k) (R) 它所对应的特征方程是: xk - a1xk-1 - a2xk-2 - •••••• - ak-1x - ak = 0 (E) 实际上,我们只要证明x = nxp是(R)的解,即可。 n

对(E)两边同乘xn-k (x0),有: xn - a1xn-1 -a2xn-2 - •••••• - a k-1xn-k+1 - ak xn-k = 0 (M) 对式(M)左边求导,得到: nxn-1 - a1(n-1)xn-2 - a2(n-2)xn-3 - •••••• - ak-1(n-k+1)xn-k - ak(n-k)xn-k-1 (M’) 现证(M’) 等于零: 因为(E)有二重根x1 = x2 = xp, 所以(M)式可改写成 (x - xp)2 • f(x) = 0 (M) 可见, (M’) 式实际上就是: 2(x - xp) • f(x) + (x - xp) 2 • f ’(x) =(x - xp)[2f(x) + (x - xp) • f ’(x)] (N’) 显然,当x = xp仍有(N’)等于零。

也就是说,把x = xp代入(M’) ,应当有下式成立: nxpn-1 - a1(n-1)xpn-2 - a2(n-2)xpn-3 - •••••• - ak-1(n-k+1)xpn-k - ak(n-k)xpn-k-1 = 0 (M’) 等于零,证毕。 上式两端同乘以xp(xp  0),有: nxpn - a1(n-1)xpn-1 - a2(n-2)xpn-2 - • • • • • • - ak-1(n-k+1)xpn-k+1- ak(n-k)xpn-k = 0 此式说明, x = nxp是(R)的一个解。 易证, x = xp是(R)的另一个解。 综上,特征方程(E)包含有二重根 x 1,2 = xp 时,齐次方程(R)通解包含有:T(n) = c1xpn + c2 n xpn,证毕。