高中数学:数列

需求分析:

数列知识列表
概要设计:

详细设计:

数列-继承

编码及单元测试:

数列:

package sequence;
public abstract class Sequence {
	/**
	 * 返回数列第n项
	 */
	protected abstract double getAn(int n);

	/**
	 * 计算数列前n项和
	 */
	public double getSum(int n) {
            double sum=0.0;
            for(int i=1;i<n;i++)
                sum+=getAn(i);
            return sum;
	}
}

等差数列:

package sequence;
public class ArithmeticSequence extends Sequence {
	// 首项
	private double a1 = 0;
	// 公差
	private double d = 0;
	public ArithmeticSequence(double a1, double d) {
			this.a1=a1;
	        this.d=d;
	}
	public ArithmeticSequence(double am, int m, double an, int n) throws Exception {
		if(m==n)
			throw new Exception("两项应为不同项");
		else{
            d=(an-am)/(n-m);
            a1=an+(1-n)*d;
		}
	}
	/**
	 * 	计算数列前n项和
	 */
	@Override
	public double getSum(int n) {
            return n*a1+n*(n-1)*d/2;
	}

	/**
	 * 返回数列第n项
	 */
	@Override
	public double getAn(int n) {
		return a1+(n-1)*d;
	}
}

等比数列:

package sequence;
public class GeometricSquence extends Sequence {
	//精度设置
	public static double PRECISION=0.0000001;
	//首项
	private double a1=1;
	//公比
	private double q=1;
	public GeometricSquence(double a1, double q) throws Exception {
            if(Math.abs(q-0)>PRECISION){
                 this.a1=a1;
                 this.q=q;
            }else
                throw new Exception("公比不能为0");
	}
	public GeometricSquence(double am, int m, double an, int n) throws Exception {
			if(m==n)
				throw new Exception("两项应为不同项");
			else{
	            q=Math.pow(an/am, 1/(n-m));
	            if(Math.abs(q-0)>PRECISION){
	            	 a1=an*Math.pow(q, 1-n);	
	            } else 
	            	throw new Exception("公比不能为0");
			}
	}
	@Override
	public double getSum(int n) {
            if(q-1>PRECISION)
                return a1*(1-Math.pow(q, n))/(1-q);
            else 
                return a1*n;
	}
	@Override
	public double getAn(int n) {
		return a1*Math.pow(q, n-1);
	}
}

斐波拉契数列:

package sequence;
public class FibonacciSequence extends Sequence {
	// 第一项
	private double a1;
	// 第二项
	private double a2;
	public FibonacciSequence(double a1, double a2) {
		this.a1=a1;
		this.a2=a2;
	}
	public double getAn(int n) {
		switch(n){
			case 1:return a1;
			case 2:return a2;
			default:return getAn(n-1)+getAn(n-2);
		}
	}
	public double getSum(int n) {
		if(n==1)
			return a1;
		else
			return getSum(n-1)+getAn(n);
	}
}

平方根估算数列:

package sequence;
public class SqrtSequence extends Sequence {
	private double radicand=0.0;//被开方数
	public SqrtSequence(double radicand) {
		this.radicand=radicand;
	}
	@Override
	public double getAn(int n) {
		double precision=1.0;
		for(int i=0;i<n;i++)
			precision/=10;
		double root=0.0;
		for(double d=1.0;d>=precision;d/=10)  
                for(;Math.pow(root+d, 2)<=radicand;root+=d);
		return root;
	}
	@Override
	public double getSum(int n) {
		throw new UnsupportedOperationException();
	}
}
平方根估算
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值