1

再帰を使用して解決する必要があるという質問がありました。ニュートン法についてです。アルゴリズムは小さな数では問題なく動作しますが、突然大きな数を与えると、プログラムはループに陥ります。

これは、ニュートンの方法の説明として私が与えられたものです。

最初に =x から始めるように言われました

  1. |a*ax|<= イプシロンの場合、a は許容範囲内の x の平方根です。それ以外は
  2. a を (a*a+x)/(2*a) に置き換えて、ステップ 1 を繰り返します。

これは私のコードです: x は、平方根をオフにする必要がある数値であり、e は許容範囲です。

public static double sqrtR (int x, double e, int a) {

    if (Math.abs(a * a - x) <= e) {
        return a;
    } else {
        a = (a * a + x) / (2 * a);
        return 1.0 *(sqrtR(x, e, a));
    }
}
4

1 に答える 1

2

問題は int の使用にあります。イプシロンが小さすぎると、プログラムは 2 つの値の間を行き来します。

たとえば、現在の関数では、sqrtR(99999999,0.1,99999999)9999 と 10000 の間で循環してしまいます。変換int aするdouble aと、狂気を止めることができます。

public static double sqrtR (long x, double e, double a) {

    if (Math.abs(a * a - x) <= e) {
        return a;
    } else {
        a = (a * a + x) / (2 * a);
        return 1.0 *(sqrtR(x, e, a));
    }
}
于 2013-10-10T15:52:32.287 に答える