在编程语言的学习中,我们学习过不少的算法,比如累加,累乘,数值交换,排序等等。在一些软件比赛和面试题中,有一类算法不容忽视,属于高频题目,我之前去企业面试的时候就遇到这样的一类题目,题目不算难,掌握方法,很快可以做出来。这类算法叫做----级数算法。
级数计算的关键是“描述出通项”,而通项的描述法有两种:一为直接法、二为间接法又称递推法。
直接法的要领是:利用项次直接写出通项式;递推法的要领是:利用前一个(或多个)通项写出后一个通项。
可以用直接法描述通项的级数计算例子有:
(1)1+2+3+4+5+……
(2)1+1/2+1/3+1/4+1/5+……等等。
可以用间接法描述通项的级数计算例子有:
(1)1+1/2+2/3+3/5+5/8+8/13+……
(2)1+1/2!+1/3!+1/4! +1/5!+……等等。
(1)直接法求通项
打个比方,我写段代码:
例1、求1+1/2+1/3+1/4+1/5+……+1/100的和。
#include <stdio.h> int main(void) { float s; int i; s=0.0; //程序中是利用项次的倒数直接描述出每一项,并进行累加。注意:因为是整数,所以分子必须写成浮点数1.0的形式 for(i=1;i<=100;i++) { s=s+1.0/i ; } printf("1+1/2+1/3+...+1/100=%f\n",s); return 0 ; }运行结果:
例2:间接法求通项
这种方法也叫做递推法
例如:
计算下列式子前20项的和:1+1/2+2/3+3/5+5/8+8/13+……。
#include <stdio.h> int main(void) { float sum,fz,fm,t,fz1; int i; sum=1; /*先将第一项的值赋给累加器s*/ fz=1;fm=2; t=fz/fm; /*将待加的第二项存入t中*/ for(i=2;i<=20;i++) { sum=sum+t; /*以下求下一项的分子分母*/ fz1=fz; /*将前项分子值保存到fz1中*/ fz=fm; /*后项分子等于前项分母*/ fm=fz1+fm; /*后项分母等于前项分子、分母之和*/ t=fz/fm; } printf("1+1/2+2/3+...=%f\n",sum); }运行结果:
例三:计算级数的值,当通项的绝对值小于eps时计算停止。
#include <stdio.h> #include <math.h> //求出最终的结果 float result(float x,float eps); int main(void) { float x,eps; scanf("%f%f",&x,&eps); printf("\n%f,%f\n",x,result(x,eps)); return 0 ; } float result(float x,float eps) { int n=1;float s,t; s=1; t=1; do { //以下t为递推算法部分 t=t*x/(2*n); s=s+(n*n+1)*t; n++; }while(fabs(t)>eps); return s; }运行结果: