我有一个问题,我应该再次使用递归来解决。这是关于牛顿的方法。该算法在小数字的情况下运行得非常好,但是当我给出更大的数字时,程序会进入一个循环。
这是我给出的牛顿方法的描述:
首先我被要求以a = x
开始这是我的代码: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));
}
}
答案 0 :(得分:2)
问题在于使用int - 如果你的epsilon太小,程序在两个值之间来回振荡。
例如,使用您现在拥有的功能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));
}
}