ImageVerifierCode 换一换
格式:DOCX , 页数:16 ,大小:171.14KB ,
资源ID:28083020      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/28083020.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(递推算法.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

递推算法.docx

1、递推算法递推算法典型例题一、教学目标1、由浅入深,了解递推算法2、掌握递推算法的经典例题二、重点难点分析1、重点:递推关系的建立2、难点:如何将所求问题转化为数学模型三、教具或课件微机四、主要教学过程(一)引入新课客观世界中的各个事物之间或者一个事物的内部各元素之间,往往存在(隐藏)着很多本质上的关联。我们设计程序前应该要通过细心的观察、丰富的联想、不断的尝试推理尽可能先归纳总结出其内在规律,然后再把这种规律性的东西抽象成数学模型,最后再去编程实现。递推关系和递归关系都是一种简洁高效的常见数学模型,我们今天先来深入研究一下递推算法如何实现。(二)教学过程设计递推法是一种重要的数学方法,在数学的

2、各个领域中都有广泛的运用,也是计算机用于数值计算的一个重要算法。这种算法特点是:一个问题的求解需一系列的计算,在已知条件和所求问题之间总存在着某种相互联系的关系,在计算时,如果可以找到前后过程之间的数量关系(即递推式),那么,这样的问题可以采用递推法来解决。从已知条件出发,逐步推出要解决的问题,叫顺推;从问题出发逐步推到已知条件,此种方法叫逆推。无论顺推还是逆推,其关键是要找到递推式。这种处理问题的方法能使复杂运算化为若干步重复的简单运算,充分发挥出计算机擅长于重复处理的特点。 递推算法的首要问题是得到相邻的数据项间的关系(即递推关系)。递推算法避开了通项公式的麻烦,把一个复杂的问题的求解,分

3、解成了连续的若干步简单运算。一般说来可以将递推算法看成是一种特殊的迭代算法。(在解题时往往还把递推问题表现为迭代形式,用循环处理。所谓“迭代”,就是在程序中用同一个变量来存放每一次推算出来的值,每一次循环都执行同一个语句,给同一变量赋以新的值,即用一个新值代替旧值,这种方法称为迭代。) 1递推关系的定义和求解递推关系的方法 有一类试题,每相邻两项数之间的变化有一定的规律性,我们可将这种规律归纳成如下简捷的递推关系式: fn=g(fn-1)或者fn-1=g(fn) 这样就在数的序列中,建立起后项和前项之间的关系。然后从初始条件(或最终结果)入手,一步步地按递推关系式递推,直至求出最终结果(或初始

4、值)。很多程序就是按这样的方法逐步求解的。如果对一个试题,我们要是能找到后一项数与前一项数的关系并清楚其起始条件(或最终结果),问题就比较容易解决,让计算机一步步计算就是了。让高速的计算机从事这种重复运算,可真正起到“物尽其用”的效果。递推分倒推法和顺推法两种形式。一般分析思路: If 求解初始条件 f1 then begin 倒推 由题意(或递推关系)确定最终结果fn; 求出倒推关系式fi-1=g(fi); for in downto 2 do fi-1g(fi); 从最终结果fn出发进行倒推 输出倒推结果fl; endthen else begin 顺推 由题意(或递推关系)确定初始值f1

5、(边界条件); 求出顺推关系式fi=g(fi-1): for i2 to n do fig(fi-1); 由边界条件f1出发进行顺推 输出顺推结果fn; end;else由此可见,递推算法的时间复杂度一般为W(n)。我们之所以将递推法划入归纳策略,是因为初始条件(或最终结果)除试题已明确给定外,都是通过对问题的整理与化简而确定的,其递推式也是对实际问题的分析与归纳而得到的,因此递推本质上属于归纳。2递推关系的建立递推关系中存在着三大基本问题:如何建立递推关系,已给出的递推关系有何性质,以及如何求解递推关系。其中核心问题是如何建立递推关系。建立递推关系的关键在于寻找第n项与前面(或后面)几项的关

6、系式,以及初始项的值(或最终结果值)。它不是一种抽象的概念,而是针对某一具体题目或一类题目而言的。3、问题举例【例 1】 有 2n的一个长方形方格,用一个12的骨牌铺满方格。例如n=3时,为23方格。此时用一个12的骨牌铺满方格,共有3种铺法: 编写一个程序,试对给出的任意一个 n(n0), 输出铺法总数。 【问题分析】(1)面对上述问题,如果思考方法不恰当,要想获得问题的解答是相当困难的。可以用递推方法归纳出问题解的一般规律。 (2)当n=1时,只能是一种铺法 如左图,铺法总数表示为X1=1; (3)当N=2时:骨牌可以两个并列竖排,也可以并列横排,再无其他方法,如下左图所示,因此,铺法总数

7、表示为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

8、。从第一骨牌排列方法考虑,只有这两种可能,所以有: Xn=Xn -1+Xn -2 (N2) X1=1 X2=2 以上就是问题求解的递推公式。任给N都可以从中获得解答。例如 N=5, X3=X2+X1=3 X4=X3+X2=5 X5=X4+X3=8 下面是输入 N,输出X1 Xn的Pascal程序: program p12_20; var x,y,z:longint; i,n:integer; begin write(Input n:); read(n); x:=0; y:=1; for i:=1 to n do begin z:=y+x; writeln(x,i:2,=,z); x:=y;y:

9、=z; end; end. 下面是运行程序输入 n=30,输出的结果: input n:30 x1=1 x2=2 x3=3 x4=5 x5=8 . x28=514229 x29=832040 x30=1346269 问题的结果就是有名的斐波那契(Fibonacci)数列问题,F(1)=0,F(2)=1,在n2时有: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

10、 + 1,然后将Yn + 1作为新的Yn代入右端,以计算出新的Yn + 1,如此重复直到|Yn + 1-Yn|为止。 初始值Y0=X,意味着么一次代入公式右端的Yn的取值为X。 (2)本题算法特点:循环,变量迭代,直到前后两次的计算误差小于10-4结束并输出结果。 程序如下: program p12_21; const e=0.0001; var x,y0,y1,y2:real; begin write(Input x:); read(x);writeln; y1:=x;y2:=x; repeat y1:=y2; y2:=2/3*y1+x/(3*y1*y1); until abs(y2-y1)

11、0,gx,y=0 F0,j=F0,j-1 j0,gx,y=0 Fi,j=Fi-1,j+Fi,j-1 i0,j0Gx,y=0 上述递推关系式的边界为:F0,0=l。考虑到最大情况下;n=20,m=20路径条数可能会超出长整数范围,所以要使用int64类型计数或高精度运算。【参考程序】program p2_1(input,output);const dx: array1.8 of Shortint=(-2, -1, 1, 2, 2, 1, -1, -2); dy: array1.8 of Shortint=(1, 2, 2, 1, -1, -2, -2, -1);var n, m, x, y, i

12、, j: Byte; g: array0.20, 0.20 of Byte; f: array0.20, 0.20 of int64;begin Readln(n, m, x, y); Fillchar(g, Sizeof(g), 0); gx,y:=1; for i:=1 to 8 doif (x+dxi=0)and(x+dxi=0)and(y+dyi=1000,然后计算起点应该的储油量oiln+(1000-disn)*(2n+1)。算法框架如下;k:=1;d:=500; 从i=1处开始向始点倒推)dis1:=500;oill:=500;repeat k:=k+l;d:=d+500(2*k-

13、1);disk:=d;oilk:=oilk-1+500;until d1000;disk;=1000; 置始点至终点的距离值)dl:=1000-disk-1; 求贮油点k处至始点的距离oilk:=dl*(2*k十1)+oilk-1; 求始点藏油量for i:=0 to k do输出第i个贮油点的距离为1000-disk-i,藏油量为oilk-i;【例5】Catalan 数在一个凸 n 边形中,通过不相交于 n 边形内部的对角线,把 n 边形拆分成若干三角形,不同的拆分数目用 hn表之,hn即为 Catalan 数。例如五边形有如下五种拆分方案(图3),故h5=5。求对于一个任意的凸 n边形相应

14、的 hn。【问题分析】 如果纯粹从h3=1,h4=2,h5=5,慢慢去归纳,恐怕很难找到问题的递推关系式更不要说找到问题的本质了。所以我们换个思维角度就像解方程中的降幂思想一样从一般情况出发去“降n”。因为多边形的任意一条边必定属于某一个三角形,所以我们以某一条边为准以这条边的两个顶点为起点,再去找任意一个多边形的顶点,来构成一个三角形,用这个三角形把一个凸多边形剖分成两个凸多边形。因为凸多边形的任意一点都可以引出n-3条对角线,但这两点引出的两组对角线并不是任意的,因为要剖分成若干个三角形且“对角线要互不相交”。 如上图所示,我们以P1Pn这条边为基准边再找Pk(2kn-1)来构成三角形,则

15、原凸n边形被剖解成了P1PkPn和两个凸多边形,其中一个是由P1,P2,Pk构成的凸k边形,另一个是由Pk,Pk+1Pn构成的凸n-k+1边形根据乘法原理,选择Pk这个顶点的分解方案为hk*hn-k+1种。而k可以选2到n-1所以再根据加法原理,得出总的方案数应该为: n-1hn= hk*hn-k+1 k=2 注意就这个递推关系式而言,临界值应该设为h2=1而不是h3=1,否则递推关系就不能得到正确解,这与原问题的实际情况可能不符(即两边形),其实这只是理解上的差异。用这个递推式求出的数列:h1,h2,h3,就是著名的catalan数列,它会经常出现在组合计数的问题中。还要注意的是,这个数列同

16、样很大当n=22时,hn就超过了长整数范围,所以如果n很大就需要用高精度运算去计算。参考程序program p2_2(input,output);const max=21;var c:array2.max of longint; n,i,k:integer; total:longint;begin write(input n=);readln(n); c2:=1; for i:=3 to n do begin ci:=0; for k:=2 to i-1 do ci:=ci+ck*ci-k+1; end; writeln(catalan=,cn);end.【例6】极值问题【问题描述】已知m,n

17、为整数,且满足下列两个条件: m,n1,2,k),即1m,nk (n2-mn-m2)2=1 你的任务是:编程由键盘输入正整数k(1k109),求一组满足上述两个条件的m、n,并且使m2+n2的值最大。例如,从键盘输入k=1995,则输出:m=987,n=1597。【问题分析】这是一道典型的数学题。如果我们就从条件出发,用求根公式,加上限制条件去解方程的话从数学意义上讲是一定可以得出正确的解。但是我们疏漏了一个重要的条件1kl09。可以验证,如果k值超过105。上述算法决不可能在竞赛限定的时间内出解更不要说l09了。所以要提高算法效率,必须对问题进行一些推理和变换,使问题更直观,同时挖掘出问题的

18、本质。首先,我们对表达式(n2-mn-m2)2=1作如下数学变换: (n2-mn-m2)2 =(m2+nm-n2)2 =(n+m)2-n(n+m)-n22 =(n)2-mn-(m)22 其中;n=m+n,m=n。虽然从形式上看,表达式并没有什么变化,但从上述数学变换式可以看出:如果m和n为一组满足条件和条件的解那么m和n也是一组满足条件和条件的解,这样我们就可以用“迭代法”求解。所以,我们令m=1,n=l,发现满足条件和条件,即是问题的一组小解。因此,我们可以将所有满足条件和条件的m和n按递增顺序排列出来即11,2,3,5,8,大家发现这正是一个Fibonacci数列(这也正是问题的本质)数列中小于k的最大两个相邻数即为试题所要求的一组m和n。所以算法就很简单了,描述如下:输入k;m:=l; n

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1