【XDOJ】C语言递归数列问题
tips:求解数列问题需注意下角标
方法梳理
- 最简单-循环法
- 循环递归法
- 函数递归法(不建议使用,防止发生栈溢出)
基础题型
数列求和
某整数数列已知信息有:a0=1,a1=2,an=2an-1-3an-2(n≥2)。编程计算该数列的第n(n≥1)项以及前n-1项之和,并输出结算结果,数据之间以一个空格分隔。
循环法(推荐)
#include <stdio.h>
int main()
{
int n,i,sum=3;//sum为前两项之和
scanf("%d",&n);
int m[15]={1,2};//定义数列并赋值前两项
for(i=2;i<=n;i++)//注意数列下角标
{
m[i]=2*m[i-1]-3*m[i-2];
sum+=m[i];
}//计算递归数列并求和
printf("%d %d",m[n],sum-m[n]);
}
循环递归法
#include <stdio.h>
int main()
{
int n;
scanf("%d",&n);
int a0=1,a1=2,an,sum;
int i;
for(i=1;i<=n;i++)
{
if(i==1)
{
sum=a0;
an=a1;
}
else if(i>1)
{
sum+=an;
an=2*a1-3*a0;
a0=a1;
a1=an;
}
}
printf("%d %d",an,sum);
return 0;
}
勒让德多项式
勒让德多项式的递推公式为 P0(x)=1,P1(x)=x,P2(x)=1.5x2-0.5,… , nPn(x) = (2n-1)xPn-1(x) – (n-1)*Pn-2(x) ,输入阶数 n(1<n<10)和变量 x 的值(0.0<x<1.0),计算1 到 n 阶勒让德多项式的和 P1(x)+P2(x)+…+Pn(x)并输出,结果保留小数点后 4 位。
#include <stdio.h>
int main()
{
int n,i;
float x;
scanf("%d %f",&n,&x);
float m[10]={1,x};
float sum=x;
for(i=2;i<=n;i++)
{
m[i]=((2*i-1)*x*m[i-1]-(i-1)*m[i-2])/i;
sum+=m[i];
}
printf("%.4f",sum);
}
进阶题型
logistic方程
有一个logistic迭代方程为 xn=rxn-1(1-xn-1)。其中n为迭代次数,r为用户给定的常数,x1是用户给定的迭代初值。规定0.0<x1<1.0且1.0<r<4.0。从n=2开始依次计算x2,x3,x4…,x1000。
观察计算结果,可能会出现两种情况:1) 如果算出了xn,同时|xn-xn-1|<0.00001,那么认为
迭代过程收敛,输出xn和正整数1; 2)如果算出的xn始终满足|xn-xn-1|>=0.00001,那么认
为迭代过程发散,输出x1000和整数0。
#include <stdio.h>
int main()
{
int i;
int flag=1;
float x1,r;
scanf("%f %f",&x1,&r);
float m[1000]={x1};
for(i=1;i<1000;i++)//数列下标为1-1000,数组下标为0-999
{
m[i]=r*m[i-1]*(1-m[i-1]);
if(m[i]-m[i-1]<0.00001&&m[i]-m[i-1]>-0.00001)//这里是并
{
printf("%.4f 1",m[i]);
flag=0;
break;
}
}
if(flag)
printf("%.4f 0",m[999]);
}
创新题型
公式求值
已知常数 A 可以表示为:A/4≈1-1/3+1/5-1/7+…,编程求解满足精度要求的 A 的近似值。
输入精度(不大于 10-3)。
输出 A 的计算结果和最后一项值(小于精度值),数据之间以一个空格分隔,数据分别
保留 6 位和 8 位小数。
#include <stdio.h>
int main()
{
double a,sum=0;
scanf("%lf",&a);
double b=-1,i=1;
while(1/i>a)//注意1/i的精度
{
b*=-1;//b控制加项减项
sum+=(1/i)*b;
i+=2;
}
sum+=1/i;
printf("%.6lf %.8lf",4*sum,1.0/i);//注意保留位数
}
乘法口诀数列
从任意给定的两个一位数字 a1 和 a2 开始,用乘法口诀生成一个n项数列 {a1,a2,…,an},
规则为从 a1 开始顺次进行,每次用当前数字与后面一个数字相乘,将结果贴在数列末尾。
如果结果不是一位数,则其每一位都应成为数列的一项。
#include <stdio.h>
int main()
{
int a1,a2,n,i,j=2,t;
scanf("%d %d %d",&a1,&a2,&n);
int m[100]={a1,a2};
for(i=2;i<n;i++)
{
t=m[i-1]*m[i-2];
if(t/10==0)
m[j++]=t;
if(t/10!=0)
{
m[j++]=t/10;//十位在前
m[j++]=t%10;//个位在后
}
}
for(i=0;i<n;i++)
printf("%d ",m[i]);
}