如何计算和系列1 + 1/2 ... + 1 / n

时间:2014-09-08 03:23:31

标签: java recursion

我在尝试非递归地找到这个系列的总和时遇到了麻烦 到目前为止,我有:

public static double sum_nr(int n) {
    int result = 0;
    for (int i = 1; i<=n; i++)
    {
        result=result+1/(i+1);
    }
    return result;
}

public static void main(String[] args){ 
    int n= 4;
    System.out.println("Calculation for sum_nr(n) " + n + " is "+ sum_nr(n));
}    

我总是得到0.0作为总和。

我做错了什么?

5 个答案:

答案 0 :(得分:3)

我认为这是由于没有使用正确的类型。你正在进行整数除法而不是使用浮点类型。

public static double sum_nr(int n) {
    double result = 0;
    for (double i = 0; i < n; i++)
    {
        result=result+1.0/(i+1);
    }
    return result;
}

答案 1 :(得分:0)

整数除法将导致0结果。您应该使用float / double而不是int来表示变量result

答案 2 :(得分:0)

结果=结果+ 1 /(I + 1);总是给0,因为我是一个整数。将i值赋给float并使用

  

float result = 0f; //将结果声明为float,或者为(int   i = 1; I&LT; = N;我++)       {float val = i;           结果=结果+ 1 /(浮动+ 1);       }

答案 3 :(得分:0)

与其他人一样,但他们的答案并未完成。

public static double sum_nr(int n) {
    float result = 0;
    for (int i = 1; i<=n; i++){
        result=result+1/((float)i+1);
    }
    return result;
}

result需要是float或double,但您还需要将i转换为float或double。无需创建新变量

答案 4 :(得分:0)

您所指的系列是harmonic series。这是一个封闭的形式近似。

H(n) = ln(n) + gamma + 1/(2n) - 1/(12n^2)

其中gamma是Euler-Mascheroni常数。请参阅here

在Java中,这里有一些代码可以正确计算并显示与n增长的实际近似值的差异。它将逐渐变小:

constant double EULER_MASCHERONI = 0.57721566490153286060651209008240243104215933593992;

public static double approximateHarmonicSummation(int n) {
    return Math.log(n) + EULER_MASCHERONI + 0.5 * n - 1.0 / (12.0 * Math.pow(n, 2));
}

public static double sum_nr(int n) {
    double result = 0;
    for (double i = 0; i < n; i++) {
        result += 1.0 / (i + 1);
    }
    return result;
}

public static void main(String[] args) {
    double approx = 0.0;
    double actual = 0.0;
    for (int n = 0; n < 1000; n++) {
       approx = approximateHarmonicSummation(n);
       actual = sum_nr(n);
       System.out.println("Calculation for approximation of sum_nr(n) " + n + " is "+ approx);
       System.out.println("Calculation of sum_nr(n) " + n + " is "+ actual);
       System.out.printlin("Difference = " + (actual - approx) + "\n");
    }
} 

希望这有帮助。