牛顿的递归方法

时间:2013-10-10 15:30:14

标签: java recursion

我有一个问题,我应该再次使用递归来解决。这是关于牛顿的方法。该算法在小数字的情况下运行得非常好,但是当我给出更大的数字时,程序会进入一个循环。

这是我给出的牛顿方法的描述:

首先我被要求以a = x

开始
  1. 如果| a * a-x |< = epsilon,那么a是公差范围内的x的平方根;否则
  2. 用(a * a + x)/(2 * a)替换a并重复步骤1
  3. 这是我的代码: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));
        }
    }
    

1 个答案:

答案 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));
    }
}