Java 牛顿';带递归的s方法

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

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

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

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


  • 如果| a*a-x |问题在于使用int-如果ε太小,程序会在两个值之间来回振荡

    例如,使用现在的函数
    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));
        }
    }