【XDOJ】C语言递归数列问题

【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]);
}
  • 14
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值