递推算法(C++版)
- 格式:ppt
- 大小:349.00 KB
- 文档页数:3
算法总结之递推与递归递推算法递归算法⼤致包括两⽅⾯的内容:1)递归起点; 2)递归关系递推起点递归起点⼀般由题⽬或者实际情况确定,不由递归关系推出。
如果⽆法确定递归起点,那么递归算法就⽆法实现。
可见,递归起点是递归算法中的重要⼀笔。
递推关系递归关系是递归算法的核⼼。
常见的递归关系有以下⼏项:1)⼀阶递推;2)多阶递推;3)间接递推;4)逆向递推;5)多维递推。
下⾯通过栗⼦来详细介绍⼀下上述类别的递推关系。
1. ⼀阶递推在计算f(i)时,只⽤到前⾯项中的⼀项,如等差数列。
公差为3的等差数列,其递推关系为:f(i)=f(i-1)+3eg. 平⾯上10条直线最多能把平⾯分成⼏部分?分析:以直线数⽬为递推变量,假定i条直线把平⾯最多分成f(i)部分,则f(i-1)表⽰i-1条直线把平⾯分成的最多部分。
在i-1条直线的平⾯上增加直线i,易得i与平⾯上已经存在了的i-1条直线最多各有⼀个交点,即直线i最多被分成i段,⽽这i段将会依次将平⾯⼀分为⼆,即直线i将最多使平⾯多增加i部分。
所以,递推关系可表⽰为:f(i)=f(i-1)+i易得当0条直线时,平⾯为1部分。
所以f(0)=1为递推起点。
上述分析可⽤下⾯代码表⽰(c++):#define MAX 100int f[MAX] //存放f(i)int lines(int n){//输⼊n为直线数⽬//输出最多部分数int i;f(0)=1;for(i=1;i<=n;i++){f[i]=f[i-1]+3;}return f[i];}2. 多阶递推在计算f(i)时,要⽤到前⾯计算过的多项,如Fibonacci数列。
eg.求Fibonacci的第10项。
分析:总所周知,Fibonacci数列中的第n项等于第n-1项加上n-2项。
所以递推关系为f(i)=f(i-1)+f(i-2);且f[0]=f[1]=1。
C++代码如下:#define MAX 100int f[MAX];int fib(int n){//输⼊n为项数//输出第n个fib数int i;f[0]=0;f[1]=1;for(i=2;i<=n;i++){f[i]=f[i-1]+f[i-2];}return f[n]}3. 间接递推在计算f[i]时需要中间量,⽽计算中间量要⽤到之前计算过的项。
递推计算方法和应用数学中有不少算法属递推算法。
递推算法就是在一个循环体内随着循环控制变量的变化,逐一通过前面的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 小数十翻二。
迭代法迭代法也称辗转法,是一种不断用变量的旧值递推新值的过程,跟迭代法相对应的是直接法(或者称为一次解法),即一次性解决问题。
迭代法又分为精确迭代和近似迭代。
“二分法”和“牛顿迭代法”属于近似迭代法。
迭代算法是用计算机解决问题的一种基本方法。
它利用计算机运算速度快、适合做重复性操作的特点,让计算机对一组指令(或一定步骤)进行重复执行,在每次执行这组指令(或这些步骤)时,都从变量的原值推出它的一个新值。
利用迭代算法解决问题,需要做好以下三个方面的工作:一、确定迭代变量。
在可以用迭代算法解决的问题中,至少存在一个直接或间接地不断由旧值递推出新值的变量,这个变量就是迭代变量。
二、建立迭代关系式。
所谓迭代关系式,指如何从变量的前一个值推出其下一个值的公式(或关系)。
迭代关系式的建立是解决迭代问题的关键,通常可以使用递推或倒推的方法来完成。
三、对迭代过程进行控制。
在什么时候结束迭代过程?这是编写迭代程序必须考虑的问题。
不能让迭代过程无休止地重复执行下去。
迭代过程的控制通常可分为两种情况:一种是所需的迭代次数是个确定的值,可以计算出来;另一种是所需的迭代次数无法确定。
对于前一种情况,可以构建一个固定次数的循环来实现对迭代过程的控制;对于后一种情况,需要进一步分析出用来结束迭代过程的条件。
例 1 :一个饲养场引进一只刚出生的新品种兔子,这种兔子从出生的下一个月开始,每月新生一只兔子,新生的兔子也如此繁殖。
如果所有的兔子都不死去,问到第12 个月时,该饲养场共有兔子多少只?分析:这是一个典型的递推问题。
我们不妨假设第 1 个月时兔子的只数为u 1 ,第 2 个月时兔子的只数为u 2 ,第 3 个月时兔子的只数为u 3 ,……根据题意,“这种兔子从出生的下一个月开始,每月新生一只兔子”,则有u 1 = 1 ,u 2 =u 1 +u 1 × 1 = 2 ,u 3 =u 2 +u 2 × 1 =4 ,……根据这个规律,可以归纳出下面的递推公式:u n =u n - 1 × 2 (n ≥ 2)对应u n 和u n - 1 ,定义两个迭代变量y 和x ,可将上面的递推公式转换成如下迭代关系:y=x*2x=y让计算机对这个迭代关系重复执行11 次,就可以算出第12 个月时的兔子数。