递推算法.docx
- 文档编号:2825218
- 上传时间:2022-11-15
- 格式:DOCX
- 页数:13
- 大小:171.27KB
递推算法.docx
《递推算法.docx》由会员分享,可在线阅读,更多相关《递推算法.docx(13页珍藏版)》请在冰豆网上搜索。
递推算法
递推算法典型例题
一、教学目标
1、由浅入深,了解递推算法
2、掌握递推算法的经典例题
二、重点难点分析
1、重点:
递推关系的建立
2、难点:
如何将所求问题转化为数学模型
三、教具或课件
微机
四、主要教学过程
(一)引入新课
客观世界中的各个事物之间或者一个事物的内部各元素之间,往往存在(隐藏)着很多本质上的关联。
我们设计程序前.应该要通过细心的观察、丰富的联想、不断的尝试推理.尽可能先归纳总结出其内在规律,然后再把这种规律性的东西抽象成数学模型,最后再去编程实现。
递推关系和递归关系都是一种简洁高效的常见数学模型,我们今天先来深入研究一下递推算法如何实现。
(二)教学过程设计
递推法是一种重要的数学方法,在数学的各个领域中都有广泛的运用,也是计算机用于数值计算的一个重要算法。
这种算法特点是:
一个问题的求解需一系列的计算,在已知条件和所求问题之间总存在着某种相互联系的关系,在计算时,如果可以找到前后过程之间的数量关系(即递推式),那么,这样的问题可以采用递推法来解决。
从已知条件出发,逐步推出要解决的问题,叫顺推;从问题出发逐步推到已知条件,此种方法叫逆推。
无论顺推还是逆推,其关键是要找到递推式。
这种处理问题的方法能使复杂运算化为若干步重复的简单运算,充分发挥出计算机擅长于重复处理的特点。
递推算法的首要问题是得到相邻的数据项间的关系(即递推关系)。
递推算法避开了通项公式的麻烦,把一个复杂的问题的求解,分解成了连续的若干步简单运算。
一般说来可以将递推算法看成是一种特殊的迭代算法。
(在解题时往往还把递推问题表现为迭代形式,用循环处理。
所谓“迭代”,就是在程序中用同一个变量来存放每一次推算出来的值,每一次循环都执行同一个语句,给同一变量赋以新的值,即用一个新值代替旧值,这种方法称为迭代。
)
1.递推关系的定义和求解递推关系的方法
有一类试题,每相邻两项数之间的变化有一定的规律性,我们可将这种规律归纳成如下简捷的递推关系式:
fn=g(fn-1)或者fn-1=g'(fn)
这样就在数的序列中,建立起后项和前项之间的关系。
然后从初始条件(或最终结果)入手,一步步地按递推关系式递推,直至求出最终结果(或初始值)。
很多程序就是按这样的方法逐步求解的。
如果对一个试题,我们要是能找到后一项数与前一项数的关系并清楚其起始条件(或最终结果),问题就比较容易解决,让计算机一步步计算就是了。
让高速的计算机从事这种重复运算,可真正起到“物尽其用”的效果。
递推分倒推法和顺推法两种形式。
一般分析思路:
If求解初始条件f1
thenbegin{倒推}
由题意(或递推关系)确定最终结果fn;
求出倒推关系式fi-1=g'(fi);
fori←ndownto2dofi-1←g(fi);{从最终结果fn出发进行倒推}
输出倒推结果fl;
end{then}
elsebegin{顺推}
由题意(或递推关系)确定初始值f1(边界条件);
求出顺推关系式fi=g(fi-1):
fori←2tondofi←g(fi-1);{由边界条件f1出发进行顺推}
输出顺推结果fn;
end;{else}
由此可见,递推算法的时间复杂度一般为W(n)。
我们之所以将递推法划入归纳策略,是因为初始条件(或最终结果)除试题已明确给定外,都是通过对问题的整理与化简而确定的,其递推式也是对实际问题的分析与归纳而得到的,因此递推本质上属于归纳。
2.递推关系的建立
递推关系中存在着三大基本问题:
如何建立递推关系,已给出的递推关系有何性质,以及如何求解递推关系。
其中核心问题是如何建立递推关系。
建立递推关系的关键在于寻找第n项与前面(或后面)几项的关系式,以及初始项的值(或最终结果值)。
它不是一种抽象的概念,而是针对某一具体题目或一类题目而言的。
3、问题举例
【例1】有2×n的一个长方形方格,用一个1×2的骨牌铺满方格。
例如n=3时,为2×3方格。
此时用一个1×2的骨牌铺满方格,共有3种铺法:
编写一个程序,试对给出的任意一个n(n>0),输出铺法总数。
【问题分析】
(1)面对上述问题,如果思考方法不恰当,要想获得问题的解答是相当困难的。
可以用递推方法归纳出问题解的一般规律。
(2)当n=1时,只能是一种铺法
如左图,铺法总数表示为X1=1;
(3)当N=2时:
骨牌可以两个并列竖排,也可以并列横排,再无其他方法,如下左图所示,因此,铺法总数表示为X2=2;
(4)当N=3时:
骨牌可以全部竖排,也可以认为在方格中已经有一个竖排骨牌,则需要在方格中排列两个横排骨牌(无重复方法),若已经在方格中排列两个横排骨牌,则必须在方格中排列一个竖排骨牌。
如题图,再无其他排列方法,因此铺法总数表示为x3=3.由此可以看出,当n=3时的排列骨牌的方法数是n=1和n=2排列方法数的和。
(5)推出一般规律:
对一般的n,要求Xn可以这样来考虑,若第一个骨牌是竖排列放置,剩下有n-1个骨牌需要排列,这时排列方法数为Xn-1;若第一个骨牌是横排列,整个方格至少有2个骨牌是横排列(1*2骨牌),因此剩下n-2个骨牌需要排列,这是骨牌排列方法数为Xn-2。
从第一骨牌排列方法考虑,只有这两种可能,所以有:
Xn=Xn-1+Xn-2(N>2)
X1=1
X2=2
以上就是问题求解的递推公式。
任给N都可以从中获得解答。
例如N=5,
X3=X2+X1=3
X4=X3+X2=5
X5=X4+X3=8
下面是输入N,输出X1~Xn的Pascal程序:
programp12_20;
var x,y,z:
longint;
i,n:
integer;
begin
write('Inputn:
');
read(n);
x:
=0;
y:
=1;
fori:
=1tondo
begin
z:
=y+x;
writeln('x[',i:
2,']=',z);
x:
=y;y:
=z;
end;
end.
下面是运行程序输入n=30,输出的结果:
inputn:
30
x[1]=1
x[2]=2
x[3]=3
x[4]=5
x[5]=8
...............................
x[28]=514229
x[29]=832040
x[30]=1346269
问题的结果就是有名的斐波那契(Fibonacci)数列问题,F
(1)=0,F
(2)=1,在n>2时有:
F(n)=F(n-1)+F(n-2)。
【例2】用迭代方法求Y=X1/3的值。
X由键盘输入。
利用下列迭代公式计算:
yn+1=2/3yn+x/(3y2n),初始值y0=x,误差要求ε=10-4。
【问题分析】
(1)迭代法即反复代入法。
在上式中,将Yn代入公式的右端,可以计算出Yn+1,然后将Yn+1作为新的Yn代入右端,以计算出新的Yn+1,如此重复直到|Yn+1-Yn|<ε为止。
初始值Y0=X,意味着么一次代入公式右端的Yn的取值为X。
(2)本题算法特点:
循环,变量迭代,直到前后两次的计算误差小于10-4结束并输出结果。
程序如下:
programp12_21;
conste=0.0001;
varx,y0,y1,y2:
real;
begin
write('Inputx:
');
read(x);writeln;
y1:
=x;y2:
=x;
repeat
y1:
=y2;
y2:
=2/3*y1+x/(3*y1*y1);
untilabs(y2-y1) writeln(x,': 3x=',y2); end. 当X=8则输出结果: 8: 3X=2.000000011E+00 当X=27则输出结果: 27: 3X=3.0000000018E+00 【例3】过河卒(NOIP2002初中组第四题) 【问题描述】棋盘上A点有一个过河卒,需要走到目标B点。 卒行走的规则: 可以向下、或者向右。 同时在棋盘上的任一点有一个对方的马(如C点).该马所在的点和所有跳跃一步可达的点称为对方马的拄制点(如下图中的c点和P1,P2,…,P8)。 卒不能通过对方马的控制点.棋盘用坐标表示,A点(0,0)、B点(n,m)(n,m为不超过20的整数).同样马的位置坐标是需要给出的C(x,y).C≠AC≠B。 现在从键盘输入n,m.,要你计算出卒从A点能够到达B点的路径的条数。 【问题分析】跳马一般是在学习回溯或搜索等算法的时候.很多书上也有类似的题目,一些比赛中也经常出现这一问题的变形(如NOIPl997初中组第三题)。 有些同学一看到这种类型的题目就去盲目搜索,但事实证明: 当n,m=15就会超时。 其实,对本题稍加分析就能发现,要到达棋盘上的一个点,只能从左边过来(我们称之为左点)或是从上面过来(我们称之为上点)。 根据加法原理.到达某一点的路径数目,就等于到达其相邻的上点和左点的路径数目之和.因此我们可以使用逐列(或逐行)递推的方法来求出起点到终点的路径数目。 障碍点(马的控制点)也完全适用,只要将到达该点的路径数目设置为0即可。 假设用F[i,j]表示到达点(i,j)的路径数目,用g[i,j]表示点(i,j)是否是对方马的控制点g[i,j]=0表示不是对方马的控制点,g[i,j]=1表示是对方马的控制点。 则,我们可以得到如下的递推关系式: F[0,0]=1 F[i,j]=0{g[x,y]=1] F[i,0]=F[i-1,0]{i>0,g[x,y]=0} F[0,j]=F[0,j-1]{j>0,g[x,y]=0} F[i,j]=F[i-1,j]+F[i,j-1]{i>0,j>0.G[x,y]=0} 上述递推关系式的边界为: F[0,0]=l。 考虑到最大情况下;n=20,m=20.路径条数可能会超出长整数范围,所以要使用int64类型计数或高精度运算。 【参考程序】 programp2_1(input,output); const dx: array[1..8]ofShortint=(-2,-1,1,2,2,1,-1,-2); dy: array[1..8]ofShortint=(1,2,2,1,-1,-2,-2,-1); var n,m,x,y,i,j: Byte; g: array[0..20,0
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法