Java 牛顿';带递归的s方法
我被问到一个问题,我应该再次使用递归来解决。这是关于牛顿的方法。这个算法对小的数字很有效,但当我给出大的数字时,程序突然进入循环 这就是我对牛顿方法的描述: 首先,我被要求从a=x开始Java 牛顿';带递归的s方法,java,recursion,Java,Recursion,我被问到一个问题,我应该再次使用递归来解决。这是关于牛顿的方法。这个算法对小的数字很有效,但当我给出大的数字时,程序突然进入循环 这就是我对牛顿方法的描述: 首先,我被要求从a=x开始 如果| a*a-x |问题在于使用int-如果ε太小,程序会在两个值之间来回振荡 例如,使用现在的函数sqrtR(99999999,0.199999999)在9999和10000之间循环。将inta转换为double a可以阻止这种疯狂 public static double sqrtR (long x, do
sqrtR(99999999,0.199999999)
在9999和10000之间循环。将inta
转换为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));
}
}
公共静态双sqrtR(长x、双e、双a){
如果(Math.abs(a*a-x)你试过把int改成long吗?实际上为什么x不是双倍的呢?a=(a*a+x)/(2*a)当然,当e
为零时,会出现堆栈溢出,您可以安全地将所有参数更改为double
,因为您已经返回了double
。愚蠢的问题:如果a
和x
是整数,那么检查涉及这些参数的计算有什么意义整数与“ε”?至少你希望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));
}
}