3:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。 (不使用数学公式,要求用递归)

解决方案 »

  1.   


    import java.util.*;
    import java.math.*;
    //
    //递归20次  第一次2/1  第二次的分母就是上一次的分子   第二次的分子就是上一次的分子和分母的和
    public class Test
    {
    static double fenzi=2.0000;
    static double fenmu=1.00000;
    static double sum=0.0000;
    static int i=1;//用来控制递归次数
    double linshi;//创建一个临时变量用于存储这次分母,以便求取下次分子值


    double Test1()
    {


    sum=sum+fenzi/fenmu;

    System.out.println("fenzi:"+fenzi);
    System.out.println("fenmu:"+fenmu);
    System.out.println("sum:"+sum);
    System.out.println("times:"+i);

    linshi=fenmu;
    fenmu=fenzi;
    fenzi=fenzi+linshi;

    while(i!=20){
    i++;
    sum=Test1();

    }

    return sum;

    }


    public static void main(String args[])
    {
    Test t=new Test();
    t.Test1();
    System.out.println("最后的和是:"+sum);
    }
    }
    纠结了一阵子  应该是递归了吧 (当时递归没学好 不知道理解对了没)
      

  2.   

    public class Test3 {
    static float sum = 0;
    static int count = 0;
    /**
     * @param args
     */
    public static void main(String[] args) {
    sum(2f,1f);
    System.out.println(sum);
    }
    public static void sum(float x,float y){
    count++;
    float temp = 0;
    sum += x/y;
    temp = x;
    x = x + y;
    y = temp;
    if(count == 20){
    return;
    }

    sum(x,y);
    }
    }
      

  3.   

    虽然在下不喜欢作业贴,但感觉这题有点意思就做了。希望LZ以后自己多动下脑筋。要知道,脑袋不经常用的话是很容易生锈的……
    public static void main(String[] args) {
    System.out.println(getSum(20, 1, 2));
    } /**
     * 数列求和
     * 
     * @param count
     *            数列项数
     * @param denominator
     *            首项分母
     * @param numerator
     *            首项分子
     * @return
     */
    static double getSum(int count, int denominator, int numerator) {
    if (denominator > numerator) {
    denominator += numerator;
    numerator = denominator - numerator;
    denominator -= numerator;
    } if (count > 1)
    return ((double) numerator / denominator + getSum(count - 1,
    numerator, numerator + denominator));
    else if (count == 1)
    return ((double) numerator / denominator);
    else if (count == 0)
    return (0);
    else
    throw new IllegalArgumentException();
    }
      

  4.   


    public static void main(String[] args)
    {
    RecursionTest rTest = new RecursionTest();
    double d = rTest.doSum(2, 1, 3);
    System.out.println(d);
    } public double doSum(double numerator, double denominator, int count)
    {
    if(count < 1) // input error
    return -1d;
    else if(count == 1 )// end condition
    {
    System.out.println("count="+count+"\t" + "return = "+ numerator/denominator);
    return numerator/denominator;
    }else { // call myself with next state params
    System.out.println("count="+count+"\t" + "return = "+ numerator/denominator + " + " + "doSum(" + Double.valueOf(numerator+denominator).intValue() + ", "+Double.valueOf(numerator).intValue()+", "+ (count-1)+")");
    return numerator/denominator + doSum(numerator+denominator, numerator, count-1);
    }
    }output:
    count=3 return = 2.0 + doSum(3, 2, 2)
    count=2 return = 1.5 + doSum(5, 3, 1)
    count=1 return = 1.6666666666666667
    5.166666666666667
      

  5.   

    public class DG{
    static double f;
     void f(double m ,double n,int i){   
        System.out.println(m/n);
        f += m/n;
        System.out.println(f); 
        if(i == 20){
                return;                //返回值类型为void的话,return表示跳出此方法。
            }
         i++;
         f(m+n,m,i);   
     return;
        }  public static void main(String[] args){
      DG d = new DG();
       d.f(2,1,1);
      }
    }
      

  6.   


    public class Test {
    static double sum = 0; public static void main(String[] args) {
    sum(20, 2, 1);
    System.out.println(sum);
    } static void sum(int count, double a, double b) {
    if (count == 1) {
    sum = a / b;
    } else {
    sum(--count, a + b, a);
    sum += a / b;
    }
    }
    }没有注释,我相信各位高手可以轻易看懂!