1

我得到了一个问题,我应该再次使用递归来解决。这是关于牛顿的方法。该算法适用于小数字,但突然当我给出较大的数字时,程序进入循环。

这是我对牛顿方法的描述:

首先我被要求从 a =x 开始

  1. 如果 |a*ax|<= epsilon,则 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 - 如果您的 epsilon 太小,程序会在两个值之间来回振荡。

例如,使用您拥有的函数,它现在sqrtR(99999999,0.1,99999999)最终在 9999 和 10000 之间循环。转换int adouble 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 回答