实用算法(基础算法-递推法)

合集下载

基本算法2-递推法

基本算法2-递推法
基本算法二
递推策略
一、引例:Fibonacci数列

Fibonacci数列的代表问题是由意大利著名数学家 Fibonacci于1202年提出的“兔子繁殖问题”(又称 “Fibonacci问题”)。 问题: 一个数列的第0项为0,第1项为1,以后每一项 都是前两项的和,这个数列就是著名的裴波那契 数列,求裴波那契数列的第N项。
参考代码
readln(n,m); f[1,0]:=1; for k:=1 to m do begin f[1,k]:=f[2,k-1]+f[n,k-1]; for i:=2 to n-1 do f[i,k]:=f[i-1,k-1]+f[i+1,k-1]; f[n,k]:=f[n-1,k-1]+f[1,k-1]; end; writeln(f[1,m]);
分析
当n=1时:AC 当n=2时:AB,AC,BC 当n=3时:
A
1 2 3
B
C
分析




设f(n)为n 个盘子从1柱移到3柱所需移动的最少盘次。 当n=1时,f(1)=1。 当n=2时,f(2)=3。 以此类推,当1柱上有n(n>2)个盘子时,我们可以利用下列步骤: 第一步:先借助3柱把1柱上面的n-1个盘子移动到2柱上,所需的 移动次数为f(n-1)。 第二步:然后再把1柱最下面的一个盘子移动到3柱上,只需要1 次盘子。 第三步:再借助1柱把2柱上的n-1个盘子移动到3上,所需的移动 次数为f(n-1)。 由以上3步得出总共移动盘子的次数为:f(n-1)+1+ f(n-1)。 所以:f(n)=2 f(n-1)+1
【例题6】传球游戏(NOIP2008普及) 【问题描述】上体育课的时候,小蛮的老师经常带着同学们一起 做游戏。这次,老师带着同学们一起做传球游戏。 游戏规则是这样的:n(3<=n<=30)个同学站成一个圆圈, 其中的一个同学手里拿着一个球,当老师吹哨子时开始传球,每 个同学可以把球传给自己左右的两个同学中的一个(左右任意), 当老师再吹哨子时,传球停止,此时,拿着球没传出去的那个同 学就是败者,要给大家表演一个节目。 聪明的小蛮提出一个有趣的问题:有多少种不同的传球方法 可以使得从小蛮手里开始传的球,传了m(3<=m<=30)次后, 又回到小蛮手里。两种传球被视作不同的方法,当且仅当这两种 方法中,接到球的同学按照顺序组成的序列是不同的。比如3个 同学1号、2号、3号,并假设小蛮为1号,球传了3次回到小蛮手 里的方式有1->2->3->1和1->3->2->1,共两种。

递推法

递推法

递推计算方法和应用数学中有不少算法属递推算法。

递推算法就是在一个循环体内随着循环控制变量的变化,逐一通过前面的k 个已知的或已算出的值计算当前待算的值的算法,所用的算式称为递推计算公式。

递推算法分为一维递推算法、二维递推算法和广义递推算法三类。

注意广义递推算法不用了解,一维递推算法又分单步算法和多步算法。

同类递推算法对应相同的基本程度模块,可以作为一个基本类型。

算式给出后程序就能给出,程序和算式有映射关系。

一维递推算法一维递推算法分为单步算法和多步算法。

所谓单步算法是指能用下面的公式表示的算法上式称为一维递推单步算式,00a x =为表头值。

它所对应的程序模块为x[0]:=a;for i=1 to n dox[i]:=f(x[i-1])多步法是指能用下面的公式表示的算法上式表示的算式称为一维递推多步算式,该算法称为一维多步(K 步)算法,1,1,0...-k x x x 的值称为表头值。

它所对应的程序模块为:for i:=0 to k-1 dox[i]:=a[i];for i:=k to n dox[i]:=f(x[i-k],x[i-k+1],…x[i -1]];这里要强调的是,为了使算式和程序之间有一对一的映射关系,应尽量使用数组元素,这也是称为一维递推算法的原因例1计算菲波拉契数列的前21项公式为程序为program p24;varf:array[0..21] of integer;i:integer;beginf[0]:=0;f[1]:=1;for i:=2 to 21 dof[i]:=f[i-1]+f[i-2];for i:=0 to 21 dowrite(f[i],' ');end.该程序和算法的特色为:1. 程序和数学公式有一对一的关系,编程难度低;2. 数组元素的序号本身具有时间顺序特征,程序中不出现数据传递;3. 程序由输入、计算和输出三部分组成,每个程序段都具有明确的单一功能,结构规范 程序中增加一个一维数组并不会发生内存溢出,但却能方便程序设计例2 小数十翻二。

第二讲递推算法

第二讲递推算法

第二讲递推算法部门: xxx时间: xxx整理范文,仅供参考,可下载自行编辑第二讲递推算法一、引例:Fibonacci数列Fibonacci数列的代表问题是由意大利著名数学家Fibonacci 于1202年提出的“兔子繁殖问题”(又称“Fibonacci问题”>。

b5E2RGbCAP问题:一个数列的第0项为0,第1项为1,以后每一项都是前两项的和,这个数列就是著名的裴波那契数列,求裴波那契数列的第N项。

p1EanqFDPw解答:•由问题,可写出递推方程算法:F[0] := 1。

F[1] := 2。

FOR i := 2 TO N DOF[I] := F[I – 1] + F[I – 2]。

总结:从这个问题可以看出,在计算裴波那契数列的每一项时,都可以由前两项推出。

这样,相邻两项之间的变化有一定的规律性,我们可以将这种规律归纳成如下简捷的递推关系式:Fn=g(Fn-1>,这就在数的序列中,建立起后项和前项之间的关系。

然后从初始条件<或是最终结果)入手,按递推关系式递推,直至求出最终结果<或初始值)。

很多问题就是这样逐步求解的。

DXDiTa9E3d对一个试卷,我们要是能找到后一项与前一项的关系并清楚其起始条件<或最终结果),问题就可以递推了,接下来便是让计算机一步步了。

让高速的计算机从事这种重复运算,真正起到“物尽其用”的效果。

RTCrpUDGiT二、递推概念:给定一个数的序列H0,H1,…,Hn,…若存在整数n0,使当n>n0时,可以用等号(或大于号、小于号>将Hn与其前面的某些项Hn(0<i<n>联系起来,这样的式子就叫做递推关系。

5PCzVD7HxA –如何建立递推关系–递推关系有何性质–如何求解递推关系递推的形式•顺推法和倒推法三、应用举例例1:昆虫繁殖科学家在热带森林中发现了一种特殊的昆虫,这种昆虫的繁殖能力很强。

每对成虫过x个月产y对卵,每对卵要过两个月长成成虫。

递推算法

递推算法
递推算法
引例:Fibonacci数列
• Fibonacci数列的代表问题是由意大利著名 数学家Fibonacci于1202年提出的“兔子繁 殖问题”(又称“Fibonacci问题”)。
• 问题: 一个数列的第0项为0,第1项为1,以
后每一项都是前两项的和,这个数列就是 著名的裴波那契数列,求裴波那契数列的 第N项。
cin>>x>>y>>z;a[1]=1; for(i=1;i<=z+1;i++)
for(k=1;k<=z+1;k++) a[i+k*x+2]+=y*a[i];
for(i=1;i<=z+1;i++)sum+=a[i]; cout<<sum<<endl; return 0; }
顺推举例3——杨辉三角1547
迭代举例5——楼梯走法
问题描述:设有一个N级楼梯,某人每步可以走1级、2级、或者 3级,求某人从底层开始走完全部楼梯的走法。
n=1 f(1)=1: 1 n=2 f(2)=2: 1 1; 2 n=3 f(3)=4: 1 1 1 ; 2 1; 1 2; 3 n=4 f(4)=7: 1 1 1 1 ; 2 1 1; 1 2 1; 3 1 ; 1 1 2; 2 2 ; 1 3
• 对一个试题,我们要是能找到后一项与前一项的关系并清 楚其起始条件(或最终结果),问题就可以递推了,接下 来便是让计算机一步步了。让高速的计算机从事这种重复 运算,真正起到“物尽其用”的效果。
递推概念
给定某些项Hi(0<i<n)联系起来, 这样的式子就叫做递推关系。

递推算法概念

递推算法概念

递推算法概念
递推算法是一种基于已知结果推导出后续结果的算法。

它是一种比较常用的计算机编程思路,在各种场景下都能发挥出良好的效果。

递推算法的基本思路是从已知的初始值开始,根据递推关系式,求解下一个结果,最终得到所需的结果。

递推算法的优点在于它可以大大减少计算量。

在许多计算问题中,递推算法都能用更少的时间和空间复杂度得到正确的结果。

同时,递推算法的思路简单,对于初学者来说也比较容易理解和实现。

递推算法有多种形式,如斐波那契数列、杨辉三角等等。

在实践中,递推算法常常用于动态规划、计算几何、图论等领域,它们大大提高了算法效率,能够有效解决许多实际问题。

在使用递推算法时,我们需要注意一些问题。

首先,我们必须准确地描述递推关系式,这是正确求解下一个结果的关键。

其次,我们必须确定好递推的边界条件,避免出现无效或死循环的情况。

最后,在实现过程中,我们还需要考虑算法的效率和精度,避免出现由于计算过程中的误差而影响结果的情况。

综上所述,递推算法是一种非常有用的计算机编程思路。

它能够大大
提高算法效率,有效地解决许多实际问题。

在使用递推算法时,我们需要注意一些问题,如准确描述递推关系式、确定递推的边界条件、考虑算法的效率和精度等。

只有在正确理解和使用递推算法时,我们才能充分发挥它的优点,有效地解决实际问题。

六、递推法

六、递推法

六、递推法方法简介递推法是解决物体与物体发生多次作用后的情况. 即当问题中涉及相互联系的物体较多并且有规律时,应根据题目特点应用数学思想将所研究的问题归类,然后求出通式. 具体方法是先分析某一次作用的情况,得出结论. 再根据多次作用的重复性和它们的共同点,把结论推广,然后结合数学知识求解. 用递推法解题的关键是导出联系相邻两次作用的递推关系式.例1 质点以加速度a 从静止出发做直线运动,在某时刻t ,加速度变为2a ;在时刻2t ,加速度变为3a ;…;在nt 时刻,加速度变为(n +1)a ,求:(1)nt 时刻质点的速度;(2)nt 时间内通过的总路程.解析 根据递推法的思想,从特殊到一般找到规律,然后求解.(1)物质在某时刻t 末的速度为at v t =2t 末的速度为at at v at v v t t t 2,222+=+=所以3t 末的速度为at at at at v v t t 32322++=+=……则nt 末的速度为nat v v t n nt +=-)1()321()1(32n at nat at n at at at ++++=+-++++=ΛΛat n n n n at )1(21)1(21+=+⋅= (2)同理:可推得nt 内通过的总路程.)12)(1(1212at n n n s ++= 例2有n 块质量均为m ,厚度为d 的相同砖块,平放在水平地面上,现将它们一块一块地叠放起来,如图6—2所示,人至少做多少功?解析 将平放在水平地面上的砖一块一块地叠放起来,每次克服重力做的功不同,因此需一次一次地计算递推出通式计算.将第2块砖平放在第一块砖上人至少需克服重力做功为mgd W =2将第3、4、…、n 块砖依次叠放起来,人克服重力至少所需做的功分别为dn mg W dmg W dmg W dmg W n )1(432543-====Λ所以将n 块砖叠放起来,至少做的总功为W =W 1+W 2+W 3+…+W n 2)1()1(32-⋅=-++++=n n mgd dn mg d mg d mg mgd Λ 例3 如图6—5所示,一排人站在沿x 轴的水平轨道旁,原点O 两侧的人的序号都记为 3,2,1(=n n …). 每人只有一个沙袋,0>x 一侧的每个沙袋质量为m =14kg ,0<x 一侧的每个沙袋质量kg m 10='. 一质量为M =48kg 的小车以某初速度v 0从原点出发向正x 轴方向滑行. 不计轨道阻力. 当车每经过一人身旁时,此人就把沙袋以水平速度v 朝与车速相反的方向沿车面扔到车上,v 的大小等于扔此袋之前的瞬间车速大小的2n 倍.(n 是此人的序号数)(1)空车出发后,车上堆积了几个沙袋时车就反向滑行?(2)车上最终有大小沙袋共多少个?解析 当人把沙袋以一定的速度朝与车速相反的方向沿车面扔到车上时,由动量守恒定律知,车速要减小,可见,当人不断地把沙袋以一定的速度扔到车上,总有一时刻使车速反向或减小到零,如车能反向运动,则另一边的人还能将沙袋扔到车上,直到车速为零,则不能再扔,否则还能扔.小车以初速0v 沿正x 轴方向运动,经过第1个(n =1)人的身旁时,此人将沙袋以0022v nv u ==的水平速度扔到车上,由动量守恒得,)(2100v m M v m Mv +=⋅-当小车运动到第2人身旁时,此人将沙袋以速度1142v nv u =='的水平速度扔到车上,同理有211)2(2)(v m M nv m v m M +=⋅-+,所以,当第n 个沙袋抛上车后的车速为n v ,根据动量守恒有111)1(,)(2])1([---++-=+=⋅--+n n n n n v nm M m n M v v nm M mv n v m n M 即. 同理有n n v mn M m n M v )1()2(1+++-=+,若抛上(n+1)包沙袋后车反向运动,则应有.0,01<>+n n v v 即.0)2(,0)1(<+->+-m n M m n M由此两式解得:n n n ,1420,1438><为整数取3. 当车反向滑行时,根据上面同样推理可知,当向左运动到第n 个人身旁,抛上第n 包沙袋后由动量守恒定律有:''++='-''-++--n n nv m n m M nv m v m n m M )3(2])1(3[11 解得:''+++'+-+='''++'+-+='+-n n n n v m n m M m n m M v v m n m M m n m M v )1(3)2(33)1(311同理 设抛上n+1个沙袋后车速反向,要求0,01≤>'+n n v v即⎩⎨⎧=>⎩⎨⎧≤'+-+>'+-+870)2(30)1(3n n m n m M m n m M 解得 即抛上第8个 沙袋后车就停止,所以车上最终有11个沙袋.例4 如图6—7所示,一水平放置的圆环形刚性窄槽固定在桌面上,槽内嵌着三个大小相同的刚性小球,它们的质量分别是m 1、m 2和m 3,m 2=m 3=2m 1. 小球与槽的两壁刚好接触而它们之间的摩擦可忽略不计. 开始时,三球处在槽中Ⅰ、Ⅱ、Ⅲ的位置,彼此间距离相等,m 2和m 3静止,m 1以初速2/0R v π=沿槽运动,R 为圆环的内半径和小球半径之和,设各球之间的碰撞皆为弹性碰撞,求此系统的运动周期T. 解析 当m 1与m 2发生弹性碰撞时,由于m 2=2m 1,所以m 1碰后弹回,m 2向前与m 3发生碰撞. 而又由于m 2=m 3,所以m 2与m 3碰后,m 3能静止在m 1的位置,m 1又以v 速度被反弹,可见碰撞又重复一次. 当m 1回到初始位置,则系统为一个周期.以m 1、m 2为研究对象,当m 1与m 2发生弹性碰撞后,根据动量守恒定律,能量守恒定律可写出:221101v m v m v m += ①222211201212121v m v m v m += ② 由①、②式得:002112002121132231)(v v m m m v v v m m m m v =+=-=+-= 以m 2、m 3为研究对象,当m 2与m 3发生弹性碰撞后,得032203='=v v v以m 3、m 1为研究对象,当m 3与m 1发生弹性碰撞后,得0130v v v ='='由此可见,当m 1运动到m 2处时与开始所处的状态相似. 所以碰撞使m 1、m 2、m 3交换位置,当m 1再次回到原来位置时,所用的时间恰好就是系统的一个周期T ,由此可得周期 ).(2021010)32232(3)(30000321s R R v R v R v R v R t t t T ===++⨯=++=ππππππ 例5 如图6—13所示,在x 轴上方有垂直于xy 平面向里的匀强磁场,磁感应强度为B ,在x 轴下方有沿y 轴负方向的匀强电场,场强为E. 一质量为m ,电量为-q 的粒子从坐标原点O沿着y 轴方向射出. 射出之后,第三次到达x 轴时,它与O 点的距离为L. 求此粒子射出时的速度v 和每次到达x 轴时运动的总路程s.(重力不计)解析 粒子进入磁场后做匀速圆周运动,经半周后通过x轴进入电场后做匀减速直线运动,速度减为零后,又反向匀加速通过x 轴进入磁场后又做匀速圆周运动,所以运动有周期性.它第3次到达x 轴时距O 点的距离L 等于圆半径的4倍(如图6—13甲所示)粒子在磁场中做匀速圆周运动的半径为 4L Bq mv R == 所以粒子射出时的速度 mBqL v 4= 粒子做圆周运动的半周长为 41Ls π=粒子以速度v 进入电场后做匀减速直线运动,能深入的最大距离为y ,因为y mEq ay v 222== 所以粒子在电场中进入一次通过的路程为 mEqL B y s 162222== 粒子第1次到达x 轴时通过的路程为 41LR s ππ=⋅=粒子第2次到达x 轴时,已通过的路程为 mE qL B Ls s s 16422212+=+=π 粒子第3次到达x 轴时,已通过的路程为 mE qL B Ls s s s 162221213+=++=π粒子第4次到达x 轴时,已通过的路程为 mE qL B Ls s s 822222214+=+=π 粒子第)12(-n 次到达x 轴时,已通过的路程为mEqL B n L n s n ns s n 16)1(4)1(2221)12(-+=-+=-π 粒子第2n 次到达x 轴时,已通过的路程为 )164()(22212mE qL B Ln s s n s n+=+=π 上面n 都取正整数.针对训练1.一物体放在光滑水平面上,初速为零,先对物体施加一向东的恒力F ,历时1秒钟,随即把此力改为向西,大小不变,历时1秒钟,接着又把此力改为向东,大小不变,历时1秒钟,如此反复,只改变力的方向,共历时1分钟. 在此1分钟内 ( )A .物体时而向东运动,时而向西运动,在1分钟末静止于初始位置之东B .物体时而向东运动,时而向西运动,在1分钟末静止于初始位置C .物体时而向东运动,时而向西运动,在1分钟末继续向东运动D .物体一直向东运动,从不向西运动,在1分钟末静止于初始位置之东2.一小球从距地面为H 的高度处由静止开始落下. 已知小球在空中运动时所受空气阻力为球所受重力的k 倍)1(<k ,球每次与地面相碰前后的速率相等,试求小球从开始运动到停止运动,(1)总共通过的路程;(2)所经历的时间.六、递推法答案1.D 2.kk k g k H k k k g k H k H 211)1(2211)1(2,22-+-++-++- (2)2s (3)m 35。

递推法

递推法

六、递推法方法简介递推法是解决物体与物体发生多次作用后的情况. 即当问题中涉及相互联系的物体较多并且有规律时,应根据题目特点应用数学思想将所研究的问题归类,然后求出通式. 具体方法是先分析某一次作用的情况,得出结论. 再根据多次作用的重复性和它们的共同点,把结论推广,然后结合数学知识求解. 用递推法解题的关键是导出联系相邻两次作用的递推关系式.塞题精析例1 质点以加速度a 从静止出发做直线运动,在某时刻t ,加速度变为2a ;在时刻2t ,加速度变为3a ;…;在nt 时刻,加速度变为(n +1)a ,求:(1)nt 时刻质点的速度;(2)nt 时间内通过的总路程.解析 根据递推法的思想,从特殊到一般找到规律,然后求解.(1)物质在某时刻t 末的速度为at v t =2t 末的速度为at at v at v v t t t 2,222+=+=所以3t 末的速度为at at at at v v t t 32322++=+=……则nt 末的速度为nat v v t n nt +=-)1()321()1(32n at nat at n at at at ++++=+-++++=at n n n n at )1(21)1(21+=+⋅= (2)同理:可推得nt 内通过的总路程.)12)(1(1212at n n n s ++= 例2 小球从高m h 1800=处自由下落,着地后跳起又下落,每与地面相碰一次,速度减小)2(1=n n,求小球从下落到停止经过的总时间为通过的总路程.(g 取10m/s 2) 解析 小球从h 0高处落地时,速率s m gh v /60200==第一次跳起时和又落地时的速率2/01v v =第二次跳起时和又落地时的速率2022/v v =第m 次跳起时和又落地时的速率m m v v 2/0=…每次跳起的高度依次4222202112,2n h g v h n h g v h ====, 通过的总路程 +++++=∑m h h h h s 222210m h n n h n h h n n n n h h m 300351112)1111(202202002242200==-+⋅=-+=++++++=- 经过的总时间为 +++++=∑m t t t t t 210s g v n n g v n n g v gv g v g v m m 183)11(])1(2121[2200010==-+=+⋅++⋅+=++++=例3 A 、B 、C 三只猎犬站立的位置构成一个边长为a 的正三角形,每只猎犬追捕猎物的速度均为v ,A 犬想追捕B 犬,B犬想追捕C 犬,C 犬想追捕A 犬,为追捕到猎物,猎犬不断调整方向,速度方向始终“盯”住对方,它们同时起动,经多长时间可捕捉到猎物? 解析 由题意可知,由题意可知,三只猎犬都做等速率曲线运动,而且任一时刻三只猎犬的位置都分别在一个正三角形的三个顶点上,但这正三角形的边长不断减小,如图6—1所示.所以要想求出捕捉的时间,则需用微元法将等速率曲线运动变成等速率直线运动,再用递推法求解.设经时间t 可捕捉猎物,再把t 分为n 个微小时间间隔△t ,在每一个△t 内每只猎犬的运动可视为直线运动,每隔△t ,正三角形的边长分别为a 1、a 2、a 3、…、a n ,显然当a n →0时三只猎犬相遇.t v n a a t v a t v a a t v a t v a a t v a BB AA a a n ∆⋅-=∆⨯-=∆-=∆⨯-=∆-=∆-=︒--=23,23323,23223,2360cos 2312111…因为,023=∆⋅-t v n a 即va t t t n 32==∆所以 此题还可用对称法,在非惯性参考系中求解.例4 一列进站后的重载列车,车头与各节车厢的质量相等,均为m ,若一次直接起动,车头的牵引力能带动30节车厢,那么,利用倒退起动,该车头能起动多少节同样质量的车厢?解析 若一次直接起动,车头的牵引力需克服摩擦力做功,使各节车厢动能都增加,若利用倒退起动,则车头的牵引力需克服摩擦力做的总功不变,但各节车厢起动的动能则不同.原来挂钩之间是张紧的,倒退后挂钩间存在△s 的宽松距离,设火车的牵引力为F ,则有: 车头起动时,有2121)(mv s mg F =∆-μ 拉第一节车厢时:11)(mv v m m ='+ 故有s g mF v v ∆-==)(21412121μ 2122221221)2(v m mv s mg F '⨯-⨯=∆-μ 拉第二节车厢时:222)2(mv v m m ='+ 故同样可得:s g m F v v ∆-==')35(32942222μ …… 推理可得 s g n m F n n v n∆+-+=')312(12μ 由mg n F v n μ312:02+>>'可得 另由题意知46,31<=n mg F 得μ因此该车头倒退起动时,能起动45节相同质量的车厢.例5 有n 块质量均为m ,厚度为d 的相同砖块,平放在水平地面上,现将它们一块一块地叠放起来,如图6—2所示,人至少做多少功?解析 将平放在水平地面上的砖一块一块地叠放起来,每次克服重力做的功不同,因此需一次一次地计算递推出通式计算.将第2块砖平放在第一块砖上人至少需克服重力做功为mgd W =2将第3、4、…、n 块砖依次叠放起来,人克服重力至少所需做的功分别为dn m g W dm g W dm g W dm g W n )1(432543-====所以将n 块砖叠放起来,至少做的总功为W =W 1+W 2+W 3+…+W n 2)1()1(32-⋅=-++++=n n m gd dn m g d m g d m g m gd 例6 如图6—3所示,有六个完全相同的长条薄片1(=i B A i i 、2、…、6)依次架在水平碗口上,一端搁在碗口,另一端架在另一薄片的正中位置(不计薄片的质量). 将质量为m 的质点置于A 1A 6的中点处,试求:A 1B 1薄片对A 6B 6的压力.解析 本题共有六个物体,通过观察会发现,A 1B 1、A 2B 2、…、A 5B 5的受力情况完全相同,因此将A 1B 1、A 2B 2、…A 5B 5作为一类,对其中一个进行受力分析,找出规律,求出通式即可求解.以第i 个薄片AB 为研究对象,受力情况如图6—3甲所示,第i 个薄片受到前一个薄片向上的支持力N i 、碗边向上的支持力和后一个薄片向下的压力N i +1. 选碗边B 点为轴,根据力矩平衡有 2,211++=⋅=⋅i i i i N N L N L N 得 所以65321)21(212121N N N N ==⨯== ① 再以A 6B 6为研究对象,受力情况如图6—3乙所示,A 6B 6受到薄片 A 5B 5向上的支持力N 6、碗向上的支持力和后一个薄片A 1B 1向下的压力N 1、质点向下的压力mg. 选B 6点为轴,根据力矩平衡有L N L mg L N ⋅=⋅+⋅61432 由①、②联立,解得 421mg N = 所以,A 1B 1薄片对A 6B 6的压力为.42mg 例7 用20块质量均匀分布的相同光滑积木块,在光滑水平面上一块叠一块地搭成单孔桥,已知每一积木块长度为L ,横截面是边长为)4/(L h h =的正方形,要求此桥具有最大的跨度(即桥孔底宽),计算跨度与桥孔高度的比值.解析 为了使搭成的单孔桥平衡,桥孔两侧应有相同的积木块,从上往下计算,使积木块均能保证平衡,要满足合力矩为零,平衡时,每块积木块都有最大伸出量,则单孔桥就有最大跨度,又由于每块积木块都有厚度,所以最大跨度与桥孔高度存在一比值.将从上到下的积木块依次计为1、2、…、n ,显然第1块相对第2块的最大伸出量为21L x =∆ 第2块相对第3块的最大伸出量为2x ∆(如图6—4所示),则224)2(222⨯==∆⋅∆-=∆⋅L L x G x L x G 同理可得第3块的最大伸出量323⨯=∆L x …… 最后归纳得出nL x n ⨯=∆2 所以总跨度h xk n n 32.11291=∆=∑=跨度与桥孔高的比值为258.1932.11==h h H k 例8 如图6—5所示,一排人站在沿x 轴的水平轨道旁,原点O 两侧的人的序号都记为3,2,1(=n n …). 每人只有一个沙袋,0>x 一侧的每个沙袋质量为m =14kg ,0<x 一侧的每个沙袋质量kg m 10='. 一质量为M =48kg 的小车以某初速度v 0从原点出发向正x 轴方向滑行. 不计轨道阻力. 当车每经过一人身旁时,此人就把沙袋以水平速度v 朝与车速相反的方向沿车面扔到车上,v 的大小等于扔此袋之前的瞬间车速大小的2n 倍.(n 是此人的序号数)(1)空车出发后,车上堆积了几个沙袋时车就反向滑行?(2)车上最终有大小沙袋共多少个?解析 当人把沙袋以一定的速度朝与车速相反的方向沿车面扔到车上时,由动量守恒定律知,车速要减小,可见,当人不断地把沙袋以一定的速度扔到车上,总有一时刻使车速反向或减小到零,如车能反向运动,则另一边的人还能将沙袋扔到车上,直到车速为零,则不能再扔,否则还能扔.小车以初速0v 沿正x 轴方向运动,经过第1个(n =1)人的身旁时,此人将沙袋以0022v nv u ==的水平速度扔到车上,由动量守恒得,)(2100v m M v m Mv +=⋅-当小车运动到第2人身旁时,此人将沙袋以速度1142v nv u =='的水平速度扔到车上,同理有211)2(2)(v m M nv m v m M +=⋅-+,所以,当第n 个沙袋抛上车后的车速为n v ,根据动量守恒有111)1(,)(2])1([---++-=+=⋅--+n n n n n v nmM m n M v v nm M mv n v m n M 即.同理有n n v mn M m n M v )1()2(1+++-=+,若抛上(n+1)包沙袋后车反向运动,则应有.0,01<>+n n v v 即.0)2(,0)1(<+->+-m n M m n M 由此两式解得:n n n ,1420,1438><为整数取3. 当车反向滑行时,根据上面同样推理可知,当向左运动到第n 个人身旁,抛上第n 包沙袋后由动量守恒定律有:''++='-''-++--n n nv m n m M nv m v m n m M )3(2])1(3[11 解得:''+++'+-+='''++'+-+='+-n n n n v m n m M m n m M v v m n m M m n m M v )1(3)2(33)1(311同理 设抛上n+1个沙袋后车速反向,要求0,01≤>'+n n v v即⎩⎨⎧=>⎩⎨⎧≤'+-+>'+-+870)2(30)1(3n n m n m M m n m M 解得 即抛上第8个 沙袋后车就停止,所以车上最终有11个沙袋.例9 如图6—6所示,一固定的斜面,倾角︒=45θ,斜面长L=2.00米. 在斜面下端有一与斜面垂直的挡板. 一质量为m 的质点,从斜面的最高点沿斜面下滑,初速度为零. 下滑到最底端与挡板发生弹性碰撞. 已知质点与斜面间的动摩擦因数20.0=μ,试求此质点从开始到发生第11次碰撞的过程中运动的总路程.解析 因为质点每次下滑均要克服摩擦力做功,且每次做功又不相同,所以要想求质点从开始到发生n 次碰撞的过程中运动的总路程,需一次一次的求,推出通式即可求解.设每次开始下滑时,小球距档板为s则由功能关系:θθμsin )()(cos 2121s s mg s s mg -=+θθμsin )()(cos 3232s s mg s s mg -=+ 即有32cos sin cos sin 2312=+-===θμθθμθ s s s s 由此可见每次碰撞后通过的路程是一等比数列,其公比为.32∴在发生第11次碰撞过程中的路程11321222s s s s s ++++=1111111321321])32(1[2)(2s s s s s s s ---⨯=-++++=)(86.9)()32(121011m m =⨯-=例10 如图6—7所示,一水平放置的圆环形刚性窄槽固定在桌面上,槽内嵌着三个大小相同的刚性小球,它们的质量分别是m 1、m 2和m 3,m 2=m 3=2m 1. 小球与槽的两壁刚好接触而它们之间的摩擦可忽略不计. 开始时,三球处在槽中Ⅰ、Ⅱ、Ⅲ的位置,彼此间距离相等,m 2和m 3静止,m 1以初速2/0R v π=沿槽运动,R 为圆环的内半径和 小球半径之和,设各球之间的碰撞皆为弹性碰撞,求此系统的运动周期T.解析 当m 1与m 2发生弹性碰撞时,由于m 2=2m 1,所以m 1碰后弹回,m 2向前与m 3发生碰撞. 而又由于m 2=m 3,所以m 2与m 3碰后,m 3能静止在m 1的位置,m 1又以v 速度被反弹,可见碰撞又重复一次. 当m 1回到初始位置,则系统为一个周期.以m 1、m 2为研究对象,当m 1与m 2发生弹性碰撞后,根据动量守恒定律,能量守恒定律可写出:221101v m v m v m += ①222211201212121v m v m v m += ② 由①、②式得:002112002121132231)(v v m m m v v v m m m m v =+=-=+-= 以m 2、m 3为研究对象,当m 2与m 3发生弹性碰撞后,得032203='=v v v以m 3、m 1为研究对象,当m 3与m 1发生弹性碰撞后,得0130v v v ='='由此可见,当m 1运动到m 2处时与开始所处的状态相似. 所以碰撞使m 1、m 2、m 3交换位置,当m 1再次回到原来位置时,所用的时间恰好就是系统的一个周期T ,由此可得周期 ).(2021010)32232(3)(30000321s R R v R v R v R v R t t t T ===++⨯=++=ππππππ 例11 有许多质量为m 的木块相互靠着沿一直线排列于光滑的水平面上. 每相邻的两个木块均用长为L 的柔绳连接着. 现用大小为F 的恒力沿排列方向拉第一个木块,以后各木块依次被牵而运动,求第n 个木块被牵动时的速度.解析 每一个木块被拉动起来后,就和前面的木块成为一体,共同做匀加速运动一段距离L 后,把绳拉紧,再牵动下一个木块. 在绳子绷紧时,有部分机械能转化为内能. 因此,如果列出221)1(n nmv FL n =-这样的关系式是错误的. 设第)1(-n 个木块刚被拉动时的速度为1-n v ,它即将拉动下一个木块时速度增至1-'n v ,第n 个木块刚被拉动时速度为n v . 对第)1(-n 个木块开始运动到它把下一段绳子即将拉紧这一过程,由动能定理有:2121)1(21)1(21----'-=n n mv n v m n FL ①对绳子把第n 个木块拉动这一短暂过程,由动量守恒定律,有n nnmv v m n ='--1)1( 得:n n v n n v 11-='- ② 把②式代入①式得:212)1(21)1()1(21-----=n n mv n v n n m n FL 整理后得:21222)1(2)1(---=-n n v n v n m FL n ③ ③式就是反映相邻两木块被拉动时速度关系的递推式,由③式可知当n =2时有:2122222v v mFL -= 当n =3时有:2222322322v v mFL -=⋅ 当n =4时有:2322423423v v mFL -=⋅ … 一般地有21222)1(2)1(---=-n n v n v n m FL n 将以上)1(-n 个等式相加,得:21222)1321(v v n m FL n n -=-++++ 所以有212222)1(v v n mFL n n n -=⋅- 在本题中01=v ,所以.)1(nmn FL v n -= 例12 如图6—8所示,质量m =2kg 的平板小车,后端放有质量M =3kg 的铁块,它和车之间动摩擦因数.50.0=μ开始时,车和铁块共同以s m v /30=的速度向右在光滑水平面上 前进,并使车与墙发生正碰,设碰撞时间极短,碰撞无机械能损失,且车身足够长,使得铁块总不能和墙相碰,求小车走过的总路程.解析 小车与墙撞后,应以原速率弹回. 铁块由于惯性继续沿原来方向运动,由于铁块和车的相互摩擦力作用,过一段时间后,它们就会相对静止,一起以相同的速度再向右运动,然后车与墙发生第二次碰撞,碰后,又重复第一次碰后的情况. 以后车与墙就这样一次次碰撞下去. 车每与墙碰一次,铁块就相对于车向前滑动一段距离,系统就有一部分机械能转化为内能,车每次与墙碰后,就左、右往返一次,车的总路程就是每次往返的路程之和.设每次与墙碰后的速度分别为v 1、v 2、v 3、…、v n 、…车每次与墙碰后向左运动的最远距离分别为s 1、s 2、s 3、…、s n 、…. 以铁块运动方向为正方向,在车与墙第)1(-n 次碰后到发生第n 次碰撞之前,对车和铁块组成的系统,由动量守恒定律有n n v m M v m M )()(1+=-- 所以 511--=+-=n n n v v m M m M v 由这一关系可得: ,5,521312v v v v ==一般地,有 ,511-=n n v v 由运动学公式可求出车与墙发生第n 次碰撞后向左运动的最远距离为2221215122-⋅==n n a v a v s 类似地,由这一关系可递推到:222142132212211512,,512,512,2-⋅=⋅=⋅==n n a v s a v s a v s a v s 所以车运动的总路程)(2321 +++++=n s s s s s 总24255111)5151511(2221221224221⋅=-⋅=+++++⋅=-a v a v a v n 因此201/215/3s m m Mg a sm v v ====μ 所以)(45m s =总 例13 10个相同的扁长木块一个紧挨一个地放在水平地面上,如图6—9所示,每个木块的质量,40.0kg m =长度m l 45.0=,它们与地面间的静摩擦因数和动摩擦因数均为.10.02=μ原来木块处于静止状态. 左方第一个木块的左端上方放一个质量为M=1.0kg 的小铅块,它与木块间的静摩 擦因数和动摩擦因数均为.20.01=μ现突然给铅块一向右的初速度s m v /3.40=,使其在大木块上滑行. 试确定铅块最后的位置在何处(落在地上还是停在哪块木块上). 重力加速度g 取2)/(10s m ,设铅块的长度与木块相比可以忽略.解析 当铅块向右运动时,铅块与10个相同的扁长木块中的第一块先发生摩擦力,若此摩擦力大于10个扁长木块与地面间的最大静摩擦力,则10个扁长木块开始运动,若此摩擦力小于10个扁长木块与地面间的最大摩擦力,则10个扁长木块先静止不动,随着铅块的运动,总有一个时刻扁长木块要运动,直到铅块与扁长木块相对静止,后又一起匀减速运动到停止.铅块M 在木块上滑行所受到的滑动摩擦力N Mg f 0.211==μ设M 可以带动木块的数目为n ,则n 满足:0)1()(221≥--+-mg n g m M f μμ 即0)1(4.04.10.2≥---n上式中的n 只能取整数,所以n 只能取2,也就是当M 滑行到倒数第二个木块时,剩下的两个木块将开始运动.设铅块刚离开第8个木块时速度为v ,则l Mg Mv Mv 821211202⋅-=μ 得:0)/(49.222>=s m v由此可见木块还可以滑到第9个木块上. M 在第9个木块上运动如图6—9甲所示,则对M 而言有:M Ma Mg =-1μ得:2/0.2s m a M -=第9及第10个木块的动力学方程为:m ma mg g m M Mg 2)(221=-+-μμμ, 得:./25.02s m a m =设M 刚离开第9个木块上时速度为v ',而第10个木块运动的速度为V ',并设木块运动的距离为s ,则M 运动的距离为l s +,有: s a V l s a v v m M 2)(2222='++='ta V t a v v m M ='+=' 消去s 及t 求出:⎩⎨⎧='-='⎩⎨⎧='='sm V s m v s m V s m v /23.0/26.0/212.0/611.0或,显然后一解不合理应舍去. 因V v '>',故M 将运动到第10个木块上.再设M 运动到第10个木块的边缘时速度为v '',这时木块的速度为V '',则:)(222l s a v v M +'+'=''解得:0463.12<'--=''s v ,故M 不能滑离第10个木块,只能停在它的表面上,最后和木块一起静止在地面上.例14 如图6—10所示,质量为m 的长方形箱子,放在光滑的水平地面上. 箱内有一质量也为m 的小滑块,滑块与箱底间无摩擦. 开始时箱子静止不动,滑块以恒定的速度v 0从箱子的A 壁处向B 处运动,后与B 壁碰撞. 假设滑块与箱壁每碰撞一次,两者相对速度的大小变为该次碰撞前相对速度的e 倍,.214=e (1)要使滑块与箱子这一系统消耗的总动能不超过其初始动能的40%,滑块与箱壁最多可碰撞几次?(2)从滑块开始运动到刚完成上述次数的碰撞期间,箱子的平均速度是多少?解析 由于滑块与箱子在水平方向不受外力,故碰撞时系统水平方向动量守恒. 根据题目给出的每次碰撞前后相对速度之比,可求出每一次碰撞过程中动能的损耗.滑块开始运动到完成题目要求的碰撞期间箱子的平均速度,应等于这期间运动的总位移与总时间的比值. (1)滑块与箱壁碰撞,碰后滑块对地速度为v ,箱子对地速度为u . 由于题中每次碰撞的e 是一样的,故有:1111220011----==--=--=n n n nu v v u u v v u u v v u e 或1111220110----==--=--=-n n n nu v u v u v u v v u v e 111122011)(----⨯⨯--⨯-=-n n n nn u v u v u v u v v u v e 即碰撞n 次后0)(v e u v n n n -=- ①碰撞第n 次的动量守恒式是0mv mu mv n n =+ ② ①、②联立得00])(1[21])(1[21v e u v e v n n n n --=-+=第n 次碰撞后,系统损失的动能)(21212220n n kn k kn u v m mv E E E +-=-=∆ kn n n E e m v e e m v m v 212121)1(4121220222020-=⨯-=+-=下面分别讨论:当146.0221121,12=-=-=∆=e E E n k kl 时25.0221121,242=-=-=∆=e E E n k k 时323.022121121,363=-=-=∆=e E E n k k 时375.0241121,484=-=-=∆=e E E n k k 时412.022141121,5105=-=-=∆=e E E n k k 时 因为要求的动能损失不超过40%,故n=4.(2)设A 、B 两侧壁的距离为L ,则滑块从开始运动到与箱壁发生第一次碰撞的时间00v L t =. 在下一次发生碰撞的时间0111||ev L v u L t =-=,共碰撞四次,另两次碰撞的时间分别为022v e L t =、033v e L t =,所以总时间).1(32033210e e e v e L t t t t t +++=+++= 在这段时间中,箱子运动的距离是:3322110t u t u t u s +++=)1(2222222)1(21)1(21)1(21323320303020200e e e eLL e L L e L L e L v e Lv e v e L v e ev L v e +++=+++-+=⨯++⨯-+⨯+=所以平均速度为:2)1()1(203203323v e e e v e L e e e e L t s v =++++++== 例15 一容积为1/4升的抽气机,每分钟可完成8次抽气动作. 一容积为1升的容器与此抽气筒相连通. 求抽气机工作多长时间才能使容器内的气体的压强由76mmmHg 降为1.9mmHg.(在抽气过程中容器内的温度保持不变)解析 根据玻一马定律,找出每抽气一次压强与容器容积和抽气机容积及原压强的关系,然后归纳递推出抽n 次的压强表达式.设气体原压强为p 0,抽气机的容积为V 0,容器的容积为V . 每抽一次压强分别为p 1、p 2、…,则由玻一马定律得:第一次抽气后:)(010V V p V p += ① 第二次抽气后:)(021V V p V p += ② 依次递推有:)(032V V p V p += ③)(01V V p V p n n +=- ○n由以上○n 式得:)lg(lg)(000vV V p p n p V V Vp nn n +=+=所以代入已知得:2725.1lg 400lg ==n (次)工作时间为:38.3827==t 分钟 例16 使一原来不带电的导体小球与一带电量为Q 的导体大球接触,分开之后,小球获得电量q. 今让小球与大球反复接触,在每次分开有后,都给大球补充电荷,使其带电量恢复到原来的值Q. 求小球可能获得的最大电量.解析 两个孤立导体相互接触,相当于两个对地电容并联,设两个导体球带电Q 1、Q 2,由于两个导体球对地电压相等,故有k C C C Q Q Q C C Q Q C Q C Q =+=+==21121121212211,,亦即即, 所以k Q Q k Q ),(21+=为常量,此式表明:带电(或不带电)的小球跟带电大球接触后,小球所获得的电量与总电量的比值不变,比值k 等于第一次带电量q 与总电量Q 的比值,即.Qqk =根据此规律就可以求出小球可能获得的最大电量. 设第1、2、…、n 次接触后小球所带的电量分别为q 1、q 2、…,有:qk q k kq q q Q k q q k kq q kq kQ q Q k q kqq q Q k q qkQ q n n n 1212223121)()()(--++++=+=++=+=+=+=+===由于1<k ,上式为无穷递减等比数列,根据求和公式得:qQ qQQ q q kq q n -=-=-=11 即小球与大球多次接触后,获得的最大电量为.qQ qQ- 例17 在如图6—11所示的电路中,S 是一单刀双掷开关,A 1和A 2为两个平行板电容器,S 掷向a 时,A 1获电荷电量为Q ,当S 再掷向b 时,A 2获电荷电量为q. 问经过很多次…S 掷向a ,再掷向b 后,A 2将获得多少电量?解析 S 掷向a 时,电源给A 1充电,S 再掷向b ,A 1给A 2充电,在经过很多次重复的过程中,A 2的带电量越来越多,两板间电压越来越大. 当A 2的电压等于电源电压时,A 2的带电量将不再增加. 由此可知A 2最终将获得电量q 2=C 2E.因为E C Q 1= 所以EQ C =1 当S 由a 第一次掷向b 时,有:21C qC q Q =- 所以Eq Q QqC )(2-=解得A 2最终获得的电量 qQ Qqq -=2 例18 电路如图6—12所示,求当R '为何值时, R AB 的阻值与“网络”的“格”数无关?此时R AB 的阻 值等于什么? 解析 要使R AB 的阻值与“网络”的“格”数无关,则图中CD 间的阻值必须等于R '才行.所以有R RR R RR R '=+'+'+222)2( 解得R R )15(-='此时AB 间总电阻R R AB )15(+=例19 如图6—13所示,在x 轴上方有垂直于xy 平面向里 的匀强磁场,磁感应强度为B ,在x 轴下方有沿y 轴负方向的匀 强电场,场强为E. 一质量为m ,电量为-q 的粒子从坐标原点O 沿着y 轴方向射出. 射出之后,第三次到达x 轴时,它与O 点的 距离为L. 求此粒子射出时的速度v 和每次到达x 轴时运动的总 路程s.(重力不计)解析 粒子进入磁场后做匀速圆周运动,经半周后通过x 轴进入电场后做匀减速直线运动,速度减为零后,又反向匀加 速通过x 轴进入磁场后又做匀速圆周运动,所以运动有周期性. 它第3次到达x 轴时距O 点的距离L 等于圆半径的4倍(如图 6—13甲所示)粒子在磁场中做匀速圆周运动的半径为 4LBq m v R ==所以粒子射出时的速度 mB q Lv 4=粒子做圆周运动的半周长为 41Ls π=粒子以速度v 进入电场后做匀减速直线运动,能深入的最大距离为y ,因为y mEq ay v 222== 所以粒子在电场中进入一次通过的路程为 mEqL B y s 162222==粒子第1次到达x 轴时通过的路程为 41LR s ππ=⋅=粒子第2次到达x 轴时,已通过的路程为 mEqL B Ls s s 16422212+=+=π 粒子第3次到达x 轴时,已通过的路程为 mEqL B Ls s s s 162221213+=++=π 粒子第4次到达x 轴时,已通过的路程为 mEqL B Ls s s 822222214+=+=π 粒子第)12(-n 次到达x 轴时,已通过的路程为mEqL B n L n s n ns s n 16)1(4)1(2221)12(-+=-+=-π粒子第2n 次到达x 轴时,已通过的路程为 )164()(22212mEqL B Ln s s n s n +=+=π上面n 都取正整数.。

递推法

递推法

第个共有n级的楼梯,某人每步 可走1级,也可走2级,也可走3级,求 从底层开始走完全部楼梯的有多少种走 法。(例如:当n=3时,共有4种走法, 即1+1+1,1+2,2+1,3 )
第11章 递推与递归
算法分析:
n的值 1 2 3 走法 1 2 4
4
7
从递推的思想出发,可以设想,从 第4项开始,每1项等于前面3项的和。
第11章 递推与递归 //程序1:递推法 #include <stdio.h> void main() { int x,s,k,i; x=6; k=0; //整除标志 while ( k!=4) { s=x; k=0; for ( i=4; i>=1; i--) { if ( s%4 ==0) k++; else break; s=s*5/4+1; } x=x+5; } printf("s=%d\n",s); }
第11章 递推与递归
第11章 递推与递归
开 始
第11章 递推与递归
主要内容
• 递推 • 递归
• 递归与分治
• 递归与回溯
第11章 递推与递归
递推法
递推关系是一种简洁高效的常见数学模型,比如
Fibonacci数列问题。
特点:在递推问题中,每个数据项都和它前面的若 干个数据项(或后面的若干个数据项)有一定的关联, 这种关联一般通过“递推关系式”表示。 问题求解一般从初始的一个或若干个数据项出发,
第11章 递推与递归
• 马踏过河卒是一道很老的题目,一些程序设计比赛中也经常出现 过这一问题的变形。一看到这种类型的题目容易让人想到用搜索 来解决,但盲目的搜索仅当n,m=15就会超时。可以试着用递推 来进行求解。 • 根据卒行走的规则,过河卒要到达棋盘上的一个点,只能有两种 可能:从左边过来(左点)或是从上面过来(上点),所以根据 加法原理,过河卒到达某一点的路径数目,就等于其到达其相邻 的上点和左点的路径数目之和,因此可用逐列(或逐行)递推的 方法求出从起点到终点的路径数目。障碍点(马的控制点)也完 全适用,只要将到达该点的路径数目设置为0即可。

递推算法

递推算法

递推算法客观世界中的各个事物之间或者一个事物的内部各元素之间,往往存在(隐藏)着很多本质上的关联。

我们设计程序前,应该要通过细心的观察、丰富的联想、不断的尝试推理,尽可能先归纳总结出其内在的规律,然后再把这种规律性的东西抽象成数学模型,最后再去编程实现。

递推算法是从问题的规模(项数)出发,找到大规模问题与小规模问题之间的关系(或前后项之间的关联),然后根据他们之间的联系逐步求解。

递推法分为顺推和倒推两种,顺推适用于已知起始条件(小规模问题的解),然后根据关联逐步推算,而倒推则相反。

如果某个问题可以使用递推算法,则该问题的解决总会存在若干个步骤,在每一步的处理上存在若干种可能性,需要做出选择,但当前做出的选择与后续问题无关,即,已做出的选择会影响到后续选择,但后面末作出的选择不会影响到前面已有的结论。

例1:a、b、c 3个不同的数字组成一个N位数,要求不出现两个a相邻,也不出现两个b相邻,这样的N位数的个数为A n,用A1-n和A2-n表示A n的关系式是什么?例2:已知楼梯有十级、某人从下向上走,每步可跨一级或二级,问该走完楼梯共有多少种不同的走法。

写出该问题的递推关系式。

例3:有2×n的一个长方形方格,用一个1×2的骨牌铺满方格。

例如n=3时,为2×3方格。

此时用一个1×2的骨牌铺满方格,共有3种铺法:试对给出的任意一个n(n>0),求出铺法总数的递推公式。

例4:我们来玩一个游戏:自然数1到N,按顺序列成一排,你可以从中取走任意个数,但是相邻的两个不可以同时被取走。

如果你能算出一共有多少种取法,那么你会被天神Lijiganjun奖励。

例5:一对大兔子每月生一对小兔子,小兔子一个月长成大兔子,问开始有一对大兔子,一年后有多少只大兔子?例6:梵塔(hanoi、汉诺、河内塔)问题。

有n个圆盘,半径各不相同,依半径从大到小,自下而上套在A柱上,另还有B,C两根空柱,现要求将A柱上的n个圆盘全部搬到C柱上去,且每次只许搬动一个盘子,还必须始终保持每根柱子上是小盘在上,大盘在下。

递推

递推
顶点数比f(n-1)多一个,故f(n)=f(n-1)+4*(n-1)+1
分析:
先看N条相交的直线最多能把平面分割成多少块
当添加第N条只显示,为了使平面最多, 则第N条直线要与前面的N-1条直线都相交,且没有任何三条直线教育一个点。
则第N条直线有N-1个交点。由于每增加N个交点,就增加N+1个平面,所以用N条直线来分隔平面,最多的数是1+1+2+3+…+n=1+n*(n+1)/2;
逆推法
所谓逆推法从已知问题的结果出发,用迭代表达式逐步推算出问题的开始的条件,即顺推法的逆过程,称为逆推。
递推算法的经典例子
【案例】从原点出发,一步只能向右走、向上走或向左走。恰好走N步且不经过已走的点共有多少种走法?
样例输入:N=2
样例输出:result=7
样例输入:N=3
样例输出:result=17
a.上一步,即f(n-1)有多少个终点是有3种走法的。
对于N=3时,f(n-1)=f(2),有3个点A、B、C可以走出3种不同走法的,这3个点是怎么得到的呢?它的存在与N值有没有必然的联系?如果我们能找到它与N之间的关系,问题也就解决了。有了这样的思路以后,我们不难找到这样的规律:如果f(n-2)存在,即上上步存在,那么从上上步出发的线路里面必然会有一条向上走的线路,而这条向上走的线路在到达f(n-1)之后,向f(n)出发时也必然有左、上、右这三种走法,那么我们就得出了这样的结论:当f(n-2)存在时,f(n-2)的值实际上就等价于f(n-1)有多少个终点是有3种走法。
算法——递推算法
递推算法
给定一个数的序列H0,H1,…,Hn,…若存在整数n0,使当n>n0时,可以用等号(或大于号、小于号)将Hn与其前面的某些项Hi(0<i<n)联系起来,这样的式子就叫做递推关系。

《递推算法》PPT课件

《递推算法》PPT课件
18
§3.3 最小二乘估计递推算法
✓信号充分丰富与系统充分激励
• 对于所有学习系统与自适应系统,信号充分丰 富(系统充分激励)是非常重要的.
– 若系统没有充分激励,则学习系统与自适应系统 就不能一致收敛.
• 不一致收敛则意味着所建模型存在未建模动态或模型 误差较大,这对模型的应用带来巨大隐患.
• 如对自适应控制,未建模动态可能导致系统崩溃.
声后利用递推算法辨识参数[m,c,k ] 。
25
END!
26
7
§3.3 最小二乘估计递推算法
于是,可以定义如下几个量的具体形式:
(
j
)
def
j
(
j
1)
def
j1
y( j 1)
Y
(
j
1)
def
Y y(
( j
j) 1)
可以利用 j 和新的观测信息 y( j 1)确定 j1
8
§3.3 最小二乘估计递推算法
H
T
(
j
1) H
(
j
1)
H ( j) T h( j 1)
22
小结
最小二乘估计递推算法的思想 最小二乘估计递推算法的推导及步骤 最小二乘估计递推算法的实现问题
23
本章总结
输入 系统模型
输入
m
J min | yi Ri |2
极值原理
i 1
迭 代 一次 最 完成
一般最小二乘
估值
测量值
递 批处理 推


精度低 加权

二 事后 乘
加权最小二乘
在线 二 乘
H
T
(3)H

基础算法-递推法(Recursive algorithm)

基础算法-递推法(Recursive algorithm)

基础算法-递推法(Recursive algorithm)There is a class of questions, the changes between every two adjacent items have a certain regularity, we can put this rule into simple recursive formula as follows:Fn=g (Fn-1)This is the number in the sequence, establish the relationship between the antecedent and consequent, then from the initial condition (or end) to start, step by step according to the recursive relation of recursion, until the final results obtained (or initial value). Many programs are solved in this way. If a test, if we can find a relationship before and after a clear and its initial condition (end result), like to solve the problem, let the computer calculation is a step by step, let the computer do the high-speed repetitive operation, can really play the "best use" effect.Recursive, backward push and push two forms. General analysis idea:If solving condition F1Then begin{inverted}The problem (or recursive relation) to determine the final result of Fa;For inverted formula Fi-1=g'(Fi);I=n {{start} from the final result FnWhile current results Fi non initial values F1 do are inverted by Fi-1=g (F1);Output push back results F1 and push backward process;End {then}Else, begin{, push,}The problem (or forward relationship) to determine the initial value of F1 (boundary conditions);Find the forward relation formula F1=g (Fi-1);I=1; {proceed from the boundary condition F1 {}}The results of Fi while do Fn non final results by Fi=g (Fi-1) CIS push back;The output of the Fn results and the pushing process;End; {else}I. backward pushing methodThe push down method, is not in the initial value of the case, by some recursive relations and informed the solution of the problem or goal, and then push down over, infer its initial conditions. Because the operations of such problems are mapped one by one, the recurrence formula can be analyzed. Then, fromthis solution or goal, take the push back section, step by step into the initial statement of the problem.Here are some examples.[1] oil storage pointA heavy truck wants to cross 1000 kilometers of desert, and the truck uses 1 liters / km of fuel, and the total capacity of the truck is 500 liters. Obviously, a truck never gets through the desert at one time. As a result, drivers must try to set up several storage points along the way so that trucks can cross the desert smoothly. How can drivers build these oil storage points? How much oil should be stored at each point to make the truck pass through the desert at the expense of least oil?Algorithm analysis:Oil storage point number calculation program and print the establishment, the oil storage from the edge of the desert of the distance and the storage of oil.No. Distance (K.M.) oil (litre)1, X, X, X, X2, X, X, X, X3, X, X, X, X........Set dis[i] as the distance between the I oil storage point and the end point (i=0);Oil[i] is the storage quantity of the I oil storage points;We can solve this problem by the back pushing method. From the end to the beginning of the push down, one by one to find the location of each oil storage point and the amount of oil storage.But when the return point are shown:The strategy of pushing back from the oil storage point I to the oil storage point i+1 is that the truck moves back and forth between point I and point i+1. Each time the truck returns to i+1, it runs out of 500 liters of gasoline, and each time it leaves the i+1, it has to hold 500 liters of gasoline. The distance between the two points must satisfy the I point i*500 gasoline fuel storage at least the requirements (0<=i<=n-1). Specifically, the first oil storage point i=1 should be 500km from the terminal i=0 and store 500 litres of gasoline at the end of the tank so that the truck can reach the terminal i=0 at i=1. That is to sayDis[1]=500 oil[1]=500;In order to i=1 storage of 500 liters of gasoline, car to i=1 truck at least from i=2 open two full oil. So the i=2 stores at least 2*500 liters of gasoline, or oil[2]=500*2=1000. In addition, combined with a return from i=1 to i=2 at a no-load,the total round-trip 3 times. The three round trip uses only 500 litres of fuel at the most provincial level. That is,d12=500/3kmDis[2]=dis[1]+d12=dis[1]+500/3In order to store 1000 liters of gasoline at i=2, the truck will drive at least three full load vehicles from i=3 to i=2.With i=3, at least 3*500 liters of gasoline, oroil[3]=500*3=1500. Plus i=2 to i=3 at the two return empty car, total 5 times. The fuel mileage should also be 500 liters, or d23=500/5,Dis[3]=dis[2]+d23=dis[2]+500/5;And so on, in order to store k*500 liters of gasoline at the i=k, the truck will drive at least k full load vehicles from i=k+1 to i=k, i.e.Oil[k+1]=[k+1]*500=oil[k]+500, plus the k-1 return space from i=k to i=k+1, total 2k-1 times. This 2k-1 times the total fuel consumption, according to the provincial minimum requirement of 500 liters, that isDK, k+1=500/ (2k-1)Dis[k+1]=dis[k]+dk, k+1=dis[k]+500/ (2k-1);Finally, the distance from i=n to the starting point is 1000-dis[n], oil[n]=500*n. In order to obtain n*500 liters of petrol truck at i=n, at least from the starting point n+1 full car to i=n, and returned from the i=n point of N times the total return empty, 2n+1 times, 2n+1 times the total fuel consumption should be just for (1000-dis[n]) * (2n+1), is the starting point for oil reservoir (oil[n]+ 1000-dis[n]) * (2n+1).Here's the program code:Program oil_lib;VarK:integer; {oil point position serial number}D, {the distance from the cumulative finish to the current point of oil storageD1:real; {i=n to start point distance}Oil, dis:array[1..10], of, real;I:integer; {auxiliary variable}BeginWriteln ('NO.','distance (K.M): 30,'oil (1.): 80);K:=1;D:=500; {start at i=1, push backward to the start point}Dis[1]: =500;Oil[1]: =500;RepeatK:=k+1;D:=d+500/ (2*k-1);Dis[k]: =d;Oil[k]: =oil[k-1]+500;Until d>=1000;Dis[k]: =1000; {starting point to end distance value}D1:=1000-dis[k-1] = {i=n to start point}Oil[k]: =d1* (2*k+1) +oil[k-1]; {start point oil storage}For i:=0 to k do {start from the start point, print the starting point to the distance from the current oil storage point and the amount of oil storage}Writeln (I, 1000-dis[k-i]: 30, oil[k-i]: 80);End. {main}Converts to the C language program as follows:#include<stdio.h>Void, main (){Int k; / * * / oil storage location numberFloat D, D1 /*d:; the cumulative end point to the current oil storage point distance, d1:i=n distance to the starting point.Float, oil[10], dis[10];Int i;Printf ("NO. distance (K.M.) \toil (L.) \n");K=1;D=500; / * * / starting point began to push down from i=1Dis[1]=500;Oil[1]=500;Do{K=k+1;D=d+500/ (2*k-1);Dis[k]=d;Oil[k]=oil[k-1]+500;}while ((d>=1000));Dis[k]=1000; / * the start point to the end point of the distance.D1=1000-dis[k-1]; / * for i=n to the starting point of the distance.Oil[k]=d1* (2*k+1) +oil[k-1]; / * for starting point of oil reservoir.For (i=0; i<k; i++) / * starting from the start point to the starting point to print the current oil storage point distance and the amount of oil reservoir.Printf ("%d\t%f\t%f\t\n", "I", "1000-dis[k-i]", "oil[k-i]");}Practical algorithm (basic algorithm - recursive method -02)Date of issue: April 10, 2003 provenance: analysis and programming of practical algorithms. Author: C language home collation, 1317 readers have read this articleForward pushing methodThe reverse process of the push down method is pushed along, starting from the boundary conditions, the recursive relations launched by the latter value, value according to the recursive formula of re launch, followed by consequent value...... recursive, until the problem from the initial statement to move forward to the solution of this problem.Real number sequence: a real number series with N items knownAi= (ai-1-ai+1) /2+d, (1<i<N) (N<60)The keyboard inputs are N, D, A1, an, m, and output amNo error is required for input data.Algorithm analysis:Analysis of the problem, the formula:Ai= (Ai-1-Ai+1) /2+d (1<i<N) (n<60)Make a thorough study and discuss its law of digital transformation. Otherwise, there will be no way to start.Make X=A2 s2[i]= (PI, Qi),Ri) represents Ai=PiX+QiD+RiA1We can according toAi=Ai-2-2Ai-1+2D=PiX+QiD+RiA1Formula releasePiX+QiD+RiA1= (Pi-2-2Pi-1), X+ (Qi-2-2Qi-1+2), D+(Ri-2-2Ri-1), A1Comparing the coefficients of X, D and A1 at the ends of an equal signPi=Pi-2-2Pi-1Qi=Qi-2-2Qi-1+2Ri=Ri-2-2Ri-1With two boundary conditionsP1=0 Q1=0 R1=1 (A1=A1)P2=1 Q2=0 R2=0 (A2=A2)According to the recursion formula of Pi, Qi and Ri, it can be calculatedS2[1]= (0,0,1);S2[3]= (-2,2,1);S2[4]= (5, -2, -2);S2[5]= (-12,8,5);...S2[i]= (Pi, Qi, Ri);...S2[N]= (PN, QN, RN);With these fundamentals, AM is not hard to get. There are two ways:1, because AN, A1 and PN, QN, RN known, so you can first according to formula:A2=AN-QND-RNA1/PNFind A2. Then A2 is substituted into the formulaA3=A1-2A2+2DFind A3. Then A3 is substituted into the formulaA4=A2-2A3+2DFind A4. Then A4 is substituted into the formulaAnd...Find Ai-1. Then Ai-1 is substituted into the formulaAi=Ai-2-2Ai-1+2DFind Ai. And so on, until the delivery until AM.The defect is due to the A2 algorithm is the result of the division, and the divisor PN increments, so the error can hardly be avoided, recursive process will continue to expand after the error, even when M is more than 40 AM was calculated from the correct value bias. Obviously, this method is simple but unreliable.2, we make A2=A2, A3=X, represented by S3[i]= (Pi, Qi, Ri), and Ai=PiX+QiD+RiA2 (i>=2) can be calculated:S3[2]= (0,0,1) =S2[1];S3[3]= (1,0,0) =S2[2];S3[4]= (-2,2,1) =S2[3];S3[5]= (5, -2-2) =S2[4];And...S3[i]= (....) =S2[i-1];.....................S3[N]= (....) =S2[N-1];Again, A3=A3, A4=X, represented by S4[i]= (PI, Qi, Ri),Ai=PiX+QiD+RiA3 (i>=3) can be computed:S4[3]= (0,0,1) =S3[2]=S2[1];S4[4]= (1,0,0) =S3[3]=S2[2];S4[5]= (-22,1) =S3[4]=S2[3];And...S4[i]= (...) =S3[i-1]=S2[i-2];And...S4[N]= (...) =S3[N-1]=S2[N-2];By analogy, we can find an interesting:AN=PN-i+2*Ai+QN-i+2*D+RN-i+2*Ai-1, that isAi= (AN-QN-i+2*D-RN-i+2*Ai-1) /PN-i+2We start with the known quantities A1 and AN, and then, in the order of A2, A3,... And AM., in accordance with the above formula, the AM is more accurate than the first algorithm due to the decrease of PN-i+2.The program code is as follows:Program ND1P4;ConstMaxn =60;VarN, m, I: integer;D: real;List: array[1..Maxn] of real; {list[i]------- corresponds to ai}S: array[1..Maxn, 1..3], of, real, {s[i, 1]--------, corresponding to Pi}{s[i, 2]-------- correspond to Qi}{s[i, 3]-------- correspond to Ri}Procedure init;BeginWrite ('n M = D);Readln (n, m, d); {input, output and constant number}Write ('a1 a', N, t);Readln (list[1], list[n]); {enter A1 and an}End; {init}Procedure solve;BeginS[1,1]: =0; s[1,2]: =0; s[1,3]: =1; {seeking recursive bounds (P1, Q1, R1) and (P2, Q2, R2)}S[2,1]: =1; s[2,2]: =0; s[2,3]: =0; {according to formulaPi<---Pi-2 - 2*Pi-1}< {qi - qi - qi - 2 * 2 - 1}< {ri ri - - - - 2 - 2 - 1} * ri{递推 (p3... pn, q3, r3), tt, rn)}for i: = 3 to n dobegins [1]: = (i, s) - [2,1] - 2 [- 1,1] * s);s [i]: = s, 2) - [2,2] - 2 - [1,2] * i + 2;s [i]: = 3, s) - [2,3] - 2 - [1,3] * s);end {for};solve {end};procedure main;beginsolve; {求 (p1, q1, r1, (pn), tt, rn)}根据公式ai = {(an - tt - i + 2 * d - rn) + 2 * ai - 1) / 2}) + pn递推a2..am} {for i: = 2 to m dolist [i]: = (list [n] - n - (i + s [2,2] * d - n - i + s [2,3] * list []) - 1) / s (n - i + 1);writeln ('', '=' list, m, [m]: 20: 10); 输出am} {end main}; {begininit 输入数据}; {main 递推和输出am}; { readln;ending. main} {。

递推算法

递推算法

递推算法递推法是一种重要的数学方法,它在数学的各个领域中都有着广泛的应用。

同时,它也是计算机用于数值计算中的一种重要算法。

1.认识递推常常遇到这样的问题:在一个序列中,下一项的值对其前一项有着某种依赖关系,求某项的值要从第一项起经过逐次推算而得到。

例如:数列0,3,6,9,12,15,…该数列的后一项的值是前一项的值加3,欲求第十项,必须先用第一项的值加3,求出第二项,然后求出第三项,第四项,第五项,…,直到第十项,当然必须事先给定第一项的值(称为边界条件或初始条件)。

可以看出,第n项的值等于第n-1项的值加3。

即:a n=a n-1+3, (n>1) (递推公式)a1=0, (n=1) (边界条件)这种在规定的初始条件下,找出后项对前项的依敕关系的操作,称为递推。

表示某项和它前面若干项的关系式就叫作递推公式。

在实际问题中类似的很多,处理这类问题的理想方法是用归纳法求出通项公式。

上例中的通项公式为a n=(n-1)*3 (n>=1)。

但是在许多情况下,要得到数列的通项公式是比较困难的,而通过已知条件归纳出一个递推关系则相对容易。

这时我们可以采用递推技术,避开求通项公式的麻烦,把一个复杂问题的求解,分解成为若干步重复的简单运算,由边界条件出发进行递推,最后得到最终结果,充分发挥出计算机擅长于重复处理的特长。

例1.有一组数规律如下:0,5,5,10,15,25,40,…,x n ,…。

求出该数列第n 项数值。

分析:设f(n)表示数列中第n项的数值,则f(1)=0 ,f(2)=5 是初始条件,f(n)=f(n-2)+f(n-1)(n≥3)是递推公式。

在语言实现上,我们取j、k、p三个变量,分别表示前二项、前一项与当前项,j、k分别取初值为0与5。

第一次通过递推公式p=j+k得到第三项,并进行移位,即j取k值、k取p值,为下次递推作准备;……;如此反复,经过n-2次的递推,p就是第n项的值。

递推

递推

倒推第三步
• 为了在I=2处贮藏1000公升汽油,卡车至少从 I=3处开三趟满载油的车至I=2处。所以I=3处至 少贮有3*500公升汽油,即oil[3]=500*3=1500。 加上I=2至I=3处的二趟返程空车,合计5次。路 途耗油亦应500公升,即d23=500/5, • Way[3]=Way[2]+d2,3=Way[2]+500/5;
问题2、实数数列(NOI94)
一个实数数列共有n项,已知 ai=(ai-1-ai+1)/2+d,(1<i<n) (n<60) 键盘输入n,d,a1,an,m,输出am。 输入数据均不需判错。
分析
根据公式ai=(ai-1-ai+1)/2+d 变形得,ai+1=ai-12ai+2d,因此该数列的通项公式为:ai=ai-2-2ai-1+2d, 已知a1,如果能求出a2,这样就可以根据公式递推求出 am
∵ ai=ai-2-2ai-1+2d ……(1) =ai-2-2(ai-3-2ai-2+2d)+2d =-2ai-3+5(ai-4-2ai-3+2d)-2d =5ai-4-12ai-3+8d ……
一直迭代下去,直到最后,可以建立ai和a1与a2的关系 式。
分析
设ai=Pia2+Qid+Ria1,我们来寻求Pi,Qi,Ri的变化规律。 ∵ ai=ai-2-2ai-1+2d ∴ ai=Pi-2a2+Qi-2d+Ri-2a1-2(Pi-1a2+Qi-1d+Ri-1a1)+2d =(Pi-2-2Pi-1)a2+(Qi-2-2Qi-1+2)d+(Ri-2-2Ri-1)a1 ∴ Pi=Pi-2-2Pi-1 ……② Qi=Qi-2-2Qi-1+2 ……③ Ri=Ri-2-2Ri-1 ……④ 显然,P1=0 Q1=0 R1=1 (i=1) P2=1 Q2=0 R2=0 (i=2) 将初值P1Q1R1和P2Q2R2代入②③④可以求出PnQnRn ∵ an=Pna2+Qnd+Rna1 ∴ a2=(an-Qnd+Rna1)/Pn 然后根据公式①递推求出am,问题解决。

入门级别递推算法

入门级别递推算法

⼊门级别递推算法递推算法什么是递推递推就是⼀种若⼲步可重复运算来描述复杂问题的⽅法,递推是⼀种重要的数学⽅法,也是编程编程解决问题的常⽤⽅法。

————⼩到⼤,已知推出未知递推有什么特征特点:⼀个问题求解需要⼀系列计算,这⼀系列的计算的步骤中存在着关联关系;在计算时,如果可以找到前后过程之间的数量关系(即递推式),那么就可以从已知条件推导出最终结果!如等差数列就可以⽤递推公式求出:1 3 5 7 9由⼩到⼤,通过已知及其数量关系找出递推式推出未知:A(n) = A(n - 1) + 2求斐波那契数列的第 n 项请使⽤递归的⽅式求斐波那契数列的第 n 项。

斐波那契数列:1,1,2,3,5…,这个数列从第 3 项开始,每⼀项都等于前两项之和输⼊格式共⼀⾏,包含整数 n。

输出格式共⼀⾏,包含⼀个整数,表⽰斐波那契数列的第 nn 项。

数据范围1≤n≤30输⼊样例:4输出样例:3递归做法:当n越来越⼤时,执⾏时间会越来越长,直到超时(时间复杂度:指数级别)因为随着n的增⼤,重复解的项就会越来越多(但⼜不得不计算),这棵树就会越来越⼤,耗时也增⼤!【参考代码】#include<iostream>using namespace std;int f(int n){if(n == 0 || n == 1) return 1;return f(n - 1) + f(n - 2);}int main(){int n;cin>>n;cout<<f(n);return 0;}改进⽅法:使⽤数组和递推的⽅法提⾼递归的效率上述时间超限,那我们可以通过减少不必要的计算来降低复杂度,即减少重复的计算,那我们可以通过递推的⽅式来优化——可以⽤⼀个数组来记录重复计算的结果,当下次再⽤时,直接使⽤即可!【参考代码】const int N = 1e5 + 10;typedef long long LL;LL a[N], n;int f(LL n){// 已知量a[1] = 1;a[2] = 2;// ⼩到⼤,已知到未知,有关系得出递推公式for(int i = 3; i <= n; i ++){a[i] = a[i - 1] + a[i - 2];}return a[n];}int main(){cin>>n;cout<<f(n);return 0;}改进⽅法:利⽤变量迭代的⽅法提⾼递归的效率采⽤两个变量x和y分别记录 n - 1项的数和n- 2项的数#include <iostream>#include <cstring>#include <algorithm>using namespace std;typedef long long LL;LL x, y, n, z;int main(){cin >> n;x = 1;y = 1;// 1 1 2 3 5 1 1 2 3 5// x y z x y zfor(int i = 3; i <= n; i ++) // z 为前两项的和故可以使⽤迭代 —— 减少重复的计算 {z = x + y;x = y;y = z;}if(n < 3) cout << 1 ;else cout << z;}猴⼦吃桃问题思路:第⼆天吃掉剩下的⼀半多⼀个,第⼗天还剩下1个。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实用算法(基础算法-递推法-01)有一类试题,每相邻两项数之间的变化有一定的规律性,我们可将这种规律归纳成如下简捷的递推关系式:F n=g(F n-1)这就在数的序列中,建立起后项和前项之间的关系,然后从初始条件(或最终结果)入手,一步步地按递推关系递推,直至求出最终结果(或初始值)。

很多程序就是按这样的方法逐步求解的。

如果对一个试题,我们要是能找到后一项与前一项的关系并清楚其起始条件(最终结果),问题就好解决,让计算机一步步算就是了,让高速的计算机做这种重复运算,可真正起到“物尽其用”的效果。

递推分倒推法和顺推法两种形式。

一般分析思路:if求解条件F1then begin{倒推}由题意(或递推关系)确定最终结果Fa;求出倒推关系式F i-1=g'(F i);i=n;{从最终结果Fn出发进行倒推}while 当前结果F i非初始值F1 do由F i-1=g(F1)倒推前项;输出倒推结果F1和倒推过程;end {then}else begin{顺推}由题意(或顺推关系)确定初始值F1(边界条件);求出顺推关系式F1=g(Fi-1);i=1;{由边界条件F1出发进行顺推}while 当前结果Fi非最终结果Fn do由Fi=g(Fi-1)顺推后项;输出顺推结果Fn和顺推过程;end; {else}一、倒推法所谓倒推法,就是在不知初始值的情况下,经某种递推关系而获知问题的解或目标,再倒推过来,推知它的初始条件。

因为这类问题的运算过程是一一映射的,故可分析得其递推公式。

然后再从这个解或目标出发,采用倒推手段,一步步地倒推到这个问题的初始陈述。

下面举例说明。

[例1] 贮油点一辆重型卡车欲穿过1000公里的沙漠,卡车耗油为1升/公里,卡车总载油能力为500公升。

显然卡车一次是过不了沙漠的。

因此司机必须设法在沿途建立几个储油点,使卡车能顺利穿越沙漠,试问司机如何建立这些储油点?每一储油点应存多少油,才能使卡车以消耗最少油的代价通过沙漠?算法分析:编程计算及打印建立的贮油点序号,各贮油点距沙漠边沿出发的距离以及存油量。

No. Distance(k.m.) oil(litre)1 X X X X2 X X X X3 X X X X... ..... ......设dis[i] 为第i个贮油点至终点(i=0)的距离;oil[i] 为第i个贮油点的存贮油量;我们可以用倒推法来解决这个问题。

从终点向始点倒推,逐一求出每个贮油点的位置及存油量。

下图表示倒推时的返回点:从贮油点i向贮油点i+1倒推的策略是,卡车在点i和点i+1间往返若干次。

卡车每次返回i+1处时正好耗尽500公升汽油,而每次从i+1出发时又必须装足500公升汽油。

两点之间的距离必须满足在耗油最少的条件下使i点贮足i*500分升汽油的要求(0<=i<=n-1)。

具体地讲,第一个贮油点i=1应距终点i=0处500km且在该处贮藏500公升汽油,这样才能保证卡车能由i=1处到达终点i=0处,这就是说dis[1]=500 oil[1]=500;为了在i=1处贮藏500公升汽油,卡车至少从i=2处开两趟满载油的车至i=1处。

所以i=2处至少贮有2*500公升汽油,即oil[2]=500*2=1000。

另外,再加上从i=1返回至i=2处的一趟空载,合计往返3次。

三次往返路程的耗油量按最省要求只能为500公升。

即d12=500/3kmdis[2]=dis[1]+d12=dis[1]+500/3为了在i=2处贮存1000公升汽油,卡车至少从i=3处开三趟满载油的车至i=2处。

报以i=3处至少贮有3*500公升汽油,即oil[3]=500*3=1500。

加上i=2至i=3处的二趟返程空车,合计5次。

路途耗油量也应为500公升,即d23=500/5, dis[3]=dis[2]+d23=dis[2]+500/5;依此类推,为了在i=k处贮藏k*500公升汽油,卡车至少从i=k+1处开k趟满载车至i=k处,即oil[k+1]=[k+1]*500=oil[k]+500,加上从i=k处返回i=k+1的k-1趟返程空间,合计2k-1次。

这2k-1次总耗油量按最省要求为500公升,即d k,k+1=500/(2k-1)dis[k+1]=dis[k]+d k,k+1=dis[k]+500/(2k-1);最后,i=n至始点的距离为1000-dis[n],oil[n]=500*n。

为了在i=n处取得n*500公升汽油,卡车至少从始点开n+1次满载车至i=n,加上从i=n返回始点的n趟返程空车,合计2n+1次,2n+1趟的总耗油量应正好为(1000-dis[n])*(2n+1),即始点藏油为oil[n]+(1000-dis[n])*(2n+1)。

下面为程序代码:program oil_lib;vark:integer; {贮油点位置序号}d, {累计终点至当前贮油点的距离}d1:real; {i=n至始点的距离}oil,dis:array[1..10] of real;i:integer; {辅助变量}beginwriteln('NO.','distance(k.m)':30,'oil(1.)':80);k:=1;d:=500; { 从i=1处开始向始点倒推}dis[1]:=500;oil[1]:=500;repeatk:=k+1;d:=d+500/(2*k-1);dis[k]:=d;oil[k]:=oil[k-1]+500;until d>=1000;dis[k]:=1000; {置始点至终点的距离值}d1:=1000-dis[k-1]; {求i=n处至始点的距离}oil[k]:=d1*(2*k+1)+oil[k-1]; {求始点藏油量}for i:=0 to k do {由始点开始,逐一打印始点至当前贮油点的距离和藏油量} writeln(i,1000-dis[k-i]:30,oil[k-i]:80);end. {main}转换为C语言程序如下:#include<stdio.h>void main(){int k; /*贮油点位置序号*/float d,d1; /*d:累计终点至当前贮油点的距离,d1:i=n至始点的距离*/float oil[10],dis[10];int i;printf("NO. distance(k.m.)\toil(l.)\n");k=1;d=500; /*从i=1处开始向始点倒推*/dis[1]=500;oil[1]=500;do{k=k+1;d=d+500/(2*k-1);dis[k]=d;oil[k]=oil[k-1]+500;}while(!(d>=1000));dis[k]=1000; /*置始点至终点的距离值*/d1=1000-dis[k-1]; /*求i=n处至始点的距离*/oil[k]=d1*(2*k+1)+oil[k-1]; /*求始点藏油量*/for(i=0;i<k;i++) /*由始点开始逐一打印始点至当前贮油点的距离和藏油量*/ printf("%d\t%f\t%f\t\n",i,1000-dis[k-i],oil[k-i]);}实用算法(基础算法-递推法-02)发表日期:2003年4月10日出处:实用算法的分析和程序设计作者:C语言之家整理已经有1317位读者读过此文顺推法倒推法的逆过程就是顺推法,即由边界条件出发,通过递推关系式推出后项值,再由后项值按递推关系式推出再后项值......,依次递推,直至从问题初始陈述向前推进到这个问题的解为止。

实数数列:一个实数数列共有N项,已知ai=(a i-1-a i+1)/2+d, (1<i<N)(N<60)键盘输入N,d,a1,a n,m,输出a m输入数据均不需判错。

算法分析:分析该题,对公式:A i=(A i-1-A i+1)/2+d (1<i<N) (n<60)作一翻推敲,探讨其数字变换规律。

不然的话会无从下手。

令X=A2s2[i]=(p i,Q i,R i)表示A i=P i X+Q i D+R i A1我们可以根据A i=A i-2-2A i-1+2D=P i X+Q i D+R i A1推出公式P i X+Q i D+R i A1=(P i-2-2P i-1)X+(Q i-2-2Q i-1+2)D+(R i-2-2R i-1)A1比较等号两端X,D和A1的系数项,可得P i=P i-2-2P i-1Q i=Q i-2-2Q i-1+2R i=R i-2-2R i-1加上两个边界条件P1=0 Q1=0 R1=1 (A1=A1)P2=1 Q2=0 R2=0 (A2=A2)根据Pi、Qi、Ri的递推式,可以计算出S2[1]=(0,0,1);S2[3]=(-2,2,1);S2[4]=(5,-2,-2);S2[5]=(-12,8,5);...................S2[i]=(P i,Q i,R i);...................S2[N]=(P N,Q N,R N);有了上述基础,AM便不难求得。

有两种方法:1、由于A N、A1和P N、Q N、R N已知,因此可以先根据公式:A2=A N-Q N D-R N A1/P N求出A2。

然后将A2代入公式A3=A1-2A2+2D求出A3。

然后将A3代入公式A4=A2-2A3+2D求出A4。

然后将A4代入公式............................求出A i-1。

然后将A i-1代入公式A i=A i-2-2A i-1+2D求出A i。

依此类推,直至递推至A M为止。

上述算法的缺陷是由于A2是两数相除的结果,而除数PN递增,因此精度误差在所难免,以后的递推过程又不断地将误差扩大,以至当M超过40时,求出的AM明显徧离正确值。

显然这种方法简单但不可靠。

2、我们令A2=A2,A3=X,由S3[i]=(P i,Q i,R i)表示A i=P i X+Q i D+R i A2(i>=2) 可计算出:S3[2]=(0,0,1)=S2[1];S3[3]=(1,0,0)=S2[2];S3[4]=(-2,2,1)=S2[3];S3[5]=(5,-2-2)=S2[4];......................S3[i]=(..........)=S2[i-1];.....................S3[N]=(..........)=S2[N-1];再令A3=A3,A4=X,由S4[i]=(p i,Q i,R i)表示A i=P i X+Q i D+R i A3(i>=3) 可计算得出:S4[3]=(0,0,1)=S3[2]=S2[1];S4[4]=(1,0,0)=S3[3]=S2[2];S4[5]=(-22,1)=S3[4]=S2[3];..........................S4[i]=(...........)=S3[i-1]=S2[i-2];.......................S4[N]=(...........)=S3[N-1]=S2[N-2];依此类推,我们可以发现一个有趣的式子:A N=P N-i+2*A i+Q N-i+2*D+R N-i+2*A i-1, 即A i=(A N-Q N-i+2*D-R N-i+2*A i-1)/P N-i+2我们从已知量A1和A N出发,依据上述公式顺序递推A2、A3、...、A M.由于P N-i+2递减,因此最后得出的A M要比第一种算法趋于精确。

相关文档
最新文档