0
package homework1C;

public class Homework1C {

public static void main(String[] args){
    double term =2,sum;
    int n;
    final double difference = 0.0000000001;
    double x;
    for(sum=0.0,n=0;term > difference;n++){


        x = find_n_fact(n);
        term=1.0/x;
         sum+=term;
         n++;
    }

        System.out.printf("e : %f\n", sum);
        System.out.printf("term : %d\n", n);

    }

public static int find_n_fact(int n){
int i;
int fact = 2;
for(i = n; i>2;i--){

    fact *= i;
}
    return fact;
}

}

これが私に求められていたことです。e(自然対数)の近似値を見つけて表示する別のJavaアプリケーションプログラムを作成します。nを2として開始し、eの2つの連続する値の差が0.0000000001未満になるまで、1ずつ増加する次の近似式を使用して、近似だけでなく、最後の近似で使用されたnの項の数を表示します。式は次のとおりです。e=1/0の近似!+ 1/1!+ 1/2!+ 1/3!+ ...、ここでn!n階乗です

これは、このプログラムの現在の出力です

e : 1.043081
term : 20

私は何を間違っているのですか?答えは

e: 2.71828
term: 15

これを解決する方法は?

4

3 に答える 3

0

nが0または1の場合、階乗関数find_n_factが正しくないようです。

于 2012-10-09T05:19:30.057 に答える
0

あなたがしたいくつかの間違い:

  • あなたの階乗の方法は間違っていました。あなたが試したようにそれは反復的な方法で行うことができましたが、私はあなたに再帰的なバージョンを提案します。
  • forループでnをmain()2回インクリメントしていますが、これは意味がありません。

完全に機能するコードは次のとおりです。

public class Homework1C {
    public static void main(String[] args) {
        double term = 2, sum = 0;
        final double difference = 0.0000000001;
        int n;

        for (n = 0; term > difference; n++) {
            term = 1.0 / find_n_fact(n);
            sum += term;
        }

        System.out.printf("e : %f\n", sum);
        System.out.printf("term : %d\n", n);
    }

    public static double find_n_fact(int n) {

        if (n == 0 || n == 1)
            return 1.0;

        return n * find_n_fact(n - 1);
    }
}

そして、階乗法の反復バージョンはここにあります:

public static double find_n_fact(int n) {
    double i, fact = 1;

    if(n < 0) // for negative numbers, factorial is nonsense.
        return -1;

    for (i = n; i > 1; i--)
        fact *= i;

    return fact;
}
于 2012-10-09T05:26:46.917 に答える
0

要約すると、次の用語1/n!はです1/(n+1)!。つまり(n+1)!、最初からやり直す理由はなく(最初から計算する)、代わりに現在の用語の値を次のn値で割るだけです。つまり、ループの内容は

    term /= n;
    sum += term;

ここで、ループが開始する前に、n、term、sumを1に初期化します(1/0!は1であるため)。もちろん、ステートメントにはそれ自体が含まれているn++ため、ループから抜け出します。このアプローチはあなたの関数とその中のエラーを取り除きます。(マイナーノート:よりも書くのが便利で、同じ値を持ちます。)もう1つの提案:次のようなステートメントを追加します。forn++find_n_fact()1e-100.0000000001

System.out.printf("sum : %12.10f   term: %12.10f  1/t: %12.10f,  n: %d\n", sum, term, 1/term, n);

デバッグ時のループ内。これにより、余分なn++エラーや階乗関数のエラーなどのエラーが明らかになります。

于 2012-10-09T06:30:02.983 に答える