您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 国内外标准规范 > 递推.递归.迭代说明
递推基本介绍递推算法是一种用若干步可重复的简运算(规律)来描述复杂问题的方法.递推是序列计算机中的一种常用算法。它是按照一定的规律来计算序列中的每个项,通常是通过计算机前面的一些项来得出序列中的指定象的值。其思想是把一个复杂的庞大的计算过程转化为简单过程的多次重复,该算法利用了计算机速度快和不知疲倦的机器特点。递推算法递推算法是一种用若干步可重复的简运算(规律)来描述复杂问题的方法.【例1】植树节那天,有五位同学参加了植树活动,他们完成植树的棵树都不相同。问第一位同学植了多少棵时,他指着旁边的第二位同学说比他多植了两棵;追问第二位同学,他又说比第三位同学多植了两棵;...如此,都说比另一位同学多植两棵。最后问到第五位同学时,他说自己植了10棵。到底第一位同学植了多少棵树?分析:设第一位同学植树的棵树为a1,欲求a1,需从第五位同学植树的棵数a5入手,根据“多两棵”这个规律,按照一定顺序逐步进行推算:(1)a5=10;(2)a4=a5+2=12;(3)a3=a4+2=14;(4)a2=a3+2=16;(5)a1=a2+2=18;Pascal程序:ProgramExaml;Vari,a:byte;begina:=10;fori:=1to4doa:=a+2;writeln('TheNumis',a);readln;end.本程序的递推运算可用下图示表示:初始值a:=10-----i=1,a=a+2(12)-----i=2,a=a+2(14)------i=3,a=a+2(16)-----i=4,a=a+2(18)----输出a值例2:十本不同的书放在书架上。现重新摆放,使每本书都不在原来放的位置。有几种摆法?当n个编号元素放在n个编号位置,元素编号与位置编号各不对应的方法数用M(n)表示,那么M(n-1)就表示n-1个编号元素放在n-1个编号位置,各不对应的方法数,其它类推.第一步,把第n个元素放在一个位置,比如位置k,一共有n-1种方法;第二步,放编号为k的元素,这时有两种情况.1,把它放到位置n,那么,对于剩下的n-2个元素,就有M(n-2)种方法;2,不把它放到位置n,这时,对于这n-1个元素,有M(n-1)种方法;综上得到M(n)=(n-1)[M(n-2)+M(n-1)]递推算法以初始(起点)值为基础,用相同的运算规律,逐次重复运算,直至运算结束。这种从“起点”重复相同的方法直至到达一定“边界”,犹如单向运动,用循环可以实现。递推的本质是按规律逐次推出(计算)先一步的结果。迭代法迭代法也称辗转法,是一种不断用变量的旧值递推新值的过程,跟迭代法相对应的是直接法(或者称为一次解法),即一次性解决问题。迭代法又分为精确迭代和近似迭代。“二分法”和“牛顿迭代法”属于近似迭代法。迭代算法是用计算机解决问题的一种基本方法。它利用计算机运算速度快、适合做重复性操作的特点,让计算机对一组指令(或一定步骤)进行重复执行,在每次执行这组指令(或这些步骤)时,都从变量的原值推出它的一个新值。目录算法递归的基本概念和特点算法递归的基本概念和特点展开编辑本段算法利用迭代算法解决问题,需要做好以下三个方面的工作:确定迭代变量在可以用迭代算法解决的问题中,至少存在一个直接或间接地不断由旧值递推出新值的变量,这个变量就是迭代变量。建立迭代关系式所谓迭代关系式,指如何从变量的前一个值推出其下一个值的公式(或关系)。迭代关系式的建立是解决迭代问题的关键,通常可以使用递推或倒推的方法来完成。对迭代过程进行控制在什么时候结束迭代过程?这是编写迭代程序必须考虑的问题。不能让迭代过程无休止地重复执行下去。迭代过程的控制通常可分为两种情况:一种是所需的迭代次数是个确定的值,可以计算出来;另一种是所需的迭代次数无法确定。对于前一种情况,可以构建一个固定次数的循环来实现对迭代过程的控制;对于后一种情况,需要进一步分析出用来结束迭代过程的条件。举例例1:一个饲养场引进一只刚出生的新品种兔子,这种兔子从出生的下一个月开始,每月新生一只兔子,新生的兔子也如此繁殖。如果所有的兔子都不死去,问到第12个月时,该饲养场共有兔子多少只?分析:这是一个典型的递推问题。我们不妨假设第1个月时兔子的只数为u1,第2个月时兔子的只数为u2,第3个月时兔子的只数为u3,……根据题意,“这种兔子从出生的下一个月开始,每月新生一只兔子”,则有u1=1,u2=u1+u1×1=2,u3=u2+u2×1=4,……根据这个规律,可以归纳出下面的递推公式:un=un-1×2(n≥2)对应un和un-1,定义两个迭代变量y和x,可将上面的递推公式转换成如下迭代关系:y=x*2x=y让计算机对这个迭代关系重复执行11次,就可以算出第12个月时的兔子数。参考程序如下:clsx=1fori=2to12y=x*2x=ynextiprintyend例2:阿米巴用简单分裂的方式繁殖,它每分裂一次要用3分钟。将若干个阿米巴放在一个盛满营养参液的容器内,45分钟后容器内充满了阿米巴。已知容器最多可以装阿米巴220,220个。试问,开始的时候往容器内放了多少个阿米巴?请编程序算出。分析:根据题意,阿米巴每3分钟分裂一次,那么从开始的时候将阿米巴放入容器里面,到45分钟后充满容器,需要分裂45/3=15次。而“容器最多可以装阿米巴2^20个”,即阿米巴分裂15次以后得到的个数是2^20。题目要求我们计算分裂之前的阿米巴数,不妨使用倒推的方法,从第15次分裂之后的2^20个,倒推出第15次分裂之前(即第14次分裂之后)的个数,再进一步倒推出第13次分裂之后、第12次分裂之后、……第1次分裂之前的个数。设第1次分裂之前的个数为x0、第1次分裂之后的个数为x1、第2次分裂之后的个数为x2、……第15次分裂之后的个数为x15,则有x14=x15/2、x13=x14/2、……xn-1=xn/2(n≥1)因为第15次分裂之后的个数x15是已知的,如果定义迭代变量为x,则可以将上面的倒推公式转换成如下的迭代公式:x=x/2(x的初值为第15次分裂之后的个数2^20)让这个迭代公式重复执行15次,就可以倒推出第1次分裂之前的阿米巴个数。因为所需的迭代次数是个确定的值,我们可以使用一个固定次数的循环来实现对迭代过程的控制。参考程序如下:clsx=2^20fori=1to15x=x/2nextiprintxendps:java中幂的算法是Math.pow(2,20);返回double,稍微注意一下例3:验证谷角猜想。日本数学家谷角静夫在研究自然数时发现了一个奇怪现象:对于任意一个自然数n,若n为偶数,则将其除以2;若n为奇数,则将其乘以3,然后再加1。如此经过有限次运算后,总可以得到自然数1。人们把谷角静夫的这一发现叫做“谷角猜想”。要求:编写一个程序,由键盘输入一个自然数n,把n经过有限次运算后,最终变成自然数1的全过程打印出来。分析:定义迭代变量为n,按照谷角猜想的内容,可以得到两种情况下的迭代关系式:当n为偶数时,n=n/2;当n为奇数时,n=n*3+1。用QBASIC语言把它描述出来就是:ifn为偶数thenn=n/2elsen=n*3+1endif这就是需要计算机重复执行的迭代过程。这个迭代过程需要重复执行多少次,才能使迭代变量n最终变成自然数1,这是我们无法计算出来的。因此,还需进一步确定用来结束迭代过程的条件。仔细分析题目要求,不难看出,对任意给定的一个自然数n,只要经过有限次运算后,能够得到自然数1,就已经完成了验证工作。因此,用来结束迭代过程的条件可以定义为:n=1。参考程序如下:clsinputPleaseinputn=;ndountiln=1ifnmod2=0thenrem如果n为偶数,则调用迭代公式n=n/2n=n/2print—;n;elsen=n*3+1print—;n;endifloopend迭代法开平方:#includestdio.h#includemath.hvoidmain(){doublea,x0,x1;printf(Inputa:\n);scanf(%lf,&a);//为什么在VC6.0中不能写成“scanf(%f,&a);”?if(a0)printf(Error!\n);else{x0=a/2;x1=(x0+a/x0)/2;do{x0=x1;x1=(x0+a/x0)/2;}while(fabs(x0-x1)=1e-6);}printf(Result:\n);printf(sqrt(%g)=%g\n,a,x1);}求平方根的迭代公式:x1=1/2*(x0+a/x0)。算法:1.先自定一个初值x0,作为a的平方根值,在我们的程序中取a/2作为a的初值;利用迭代公式求出一个x1。此值与真正的a的平方根值相比,误差很大。2.把新求得的x1代入x0中,准备用此新的x0再去求出一个新的x1.3.利用迭代公式再求出一个新的x1的值,也就是用新的x0又求出一个新的平方根值x1,此值将更趋近于真正的平方根值。4.比较前后两次求得的平方根值x0和x1,如果它们的差值小于我们指定的值,即达到我们要求的精度,则认为x1就是a的平方根值,去执行步骤5;否则执行步骤2,即循环进行迭代。迭代法是用于求方程或方程组近似根的一种常用的算法设计方法。设方程为f(x)=0,用某种数学方法导出等价的形式x=g(x),然后按以下步骤执行:(1)选一个方程的近似根,赋给变量x0;(2)将x0的值保存于变量x1,然后计算g(x1),并将结果存于变量x0;(3)当x0与x1的差的绝对值还小于指定的精度要求时,重复步骤(2)的计算。若方程有根,并且用上述方法计算出来的近似根序列收敛,则按上述方法求得的x0就认为是方程的根。上述算法用C程序的形式表示为:【算法】迭代法求方程的根{x0=初始近似根;do{x1=x0;x0=g(x1);/*按特定的方程计算新的近似根*/}while(fabs(x0-x1)Epsilon);printf(“方程的近似根是%f\n”,x0);}迭代算法也常用于求方程组的根,令X=(x0,x1,…,xn-1)设方程组为:xi=gi(X)(I=0,1,…,n-1)则求方程组根的迭代算法可描述如下:【算法】迭代法求方程组的根{for(i=0;ix=初始近似根;do{for(i=0;iy=x;for(i=0;ix=gi(X);for(delta=0.0,i=0;iif(fabs(y-x)delta)delta=fabs(y-x);}while(deltaEpsilon);for(i=0;iprintf(“变量x[%d]的近似根是%f”,I,x);printf(“\n”);}具体使用迭代法求根时应注意以下两种可能发生的情况:(1)如果方程无解,算法求出的近似根序列就不会收敛,迭代过程会变成死循环,因此在使用迭代算法前应先考察方程是否有解,并在程序中对迭代的次数给予限制;(2)方程虽然有解,但迭代公式选择不当,或迭代的初始近似根选择不合理,也会导致迭代失败。递归递归是设计和描述算法的一种有力的工具,由于它在复杂算法的描述中被经常采用,为此在进一步介绍其他算法设计方法之前先讨论它。能采用递归描述的算法通常有这样的特征:为求解规模为N的问题,设法将它分解成规模较小的问题,然后从这些小问题的解方便地构造出大问题的解,并且这些规模较小的问题也能采用同样的分解和综合方法,分解成规模更小的问题,并从这些更小问题的解构造出规模较大问题的解。特别地,当规模N=1时,能直接得解。【问题】编写计算斐波那契(Fibonacci)数列的第n项函数fib(n)。斐波那契数列为:0、1、1、2、3、……,即:fib(0)=0;fib(1)=1;fib(n)=fib(n-1)+fib(n-2)(当n1时)。写成递归函数有:intfib(intn){if(n==0)return0;if(n==1)return1;if(n1)returnfib(n-1)+fib(n-2);}递归算法的执行过程分递推和回归两个阶段。在递推阶段,把较复杂的问题(
本文标题:递推.递归.迭代说明
链接地址:https://www.777doc.com/doc-4898524 .html