这是一个有效的while循环吗?

时间:2016-11-25 20:06:19

标签: java loops while-loop

这是一项任务:

"让我们说你有一个号码,一个,你想找到它 平方根。一种方法是从一个非常粗略的猜测开始 答案,x0,然后使用以下公式改进猜测 x1 =(x0 + a / x0)/ 2

例如,如果我们想找到9的平方根,我们从x0 = 6开始, 然后x1 =(6 + 9/6)/ 2 = 15/4 = 3.75,这更接近。 我们可以重复这个过程,使用x1来计算x2,依此类推。在这 case,x2 = 3.075,x3 = 3.00091。所以这很快就会收敛 正确答案(即3)。

编写一个名为squareRoot的方法,该方法将double作为参数和 返回参数的平方根的近似值,使用此方法 技术。您不能使用Math.sqrt

作为您的初步猜测,您应该使用/ 2。你的方法应该迭代直到 它得到两个连续的估计值相差小于0.0001;其他 单词,直到绝对值小于0.0001。您可以使用 Math.abs计算绝对值。"

这是练习while循环的练习。如你所见,我完成了作业,我觉得它有效吗?但我不确定我是如何解决的?换句话说,我应该在这里改进什么?有没有其他方式进入循环不同?如何更恰当地命名变量?最后,我的方法是好还是坏?

public class squareRoot {
    public static void main(String args[]){
        System.out.println(squareRoot(192.0));
    }

    public static double squareRoot(double a){

        double gs = a/2; //guess
        double ig = (gs + (a/gs))/2; //improving guess

        double ig1 = (ig + (a/ig))/2; //one more improving guess, ig1

        while (Math.abs((ig-ig1)) > 0.0001){  //with ig and ig1, I am entering the loop
            ig = (ig1 + (a/ig1))/2;
            ig1 = (ig + (a/ig))/2;  //ig1 has to be less then ig
        }
        return ig1;
    }
}

2 个答案:

答案 0 :(得分:2)

你的方法几乎是正确的。

让我们先谈谈变量。 IMO,您应该使用变量的全名而不是首字母缩略词。使用guess代替gs。使用improvedGuess代替ig

现在,我们可以看到问题出在哪里。为了完成while循环,连续两次猜测'差异必须小于0.0001。但是,在这里你只是比较第一次和第二次猜测,第三次和第四次猜测,第五次和第六次猜测等。如果第四次和第五次猜测'差异小于0.0001?你的循环不会停止。相反,它返回第6个猜测的值。虽然它更准确,但它不符合要求。

这是我提出的

public static double squareRoot(double a){

    double guess = a/2;
    double improvedGuess = (guess + (a/guess))/2;

    while (Math.abs((guess - improvedGuess)) > 0.0001){
        guess = improvedGuess;
        improvedGuess = (guess + (a/guess))/2;
    }
    return improvedGuess;
}

答案 1 :(得分:-1)

这是我的解决方案

  private static double squareRoot(double a){

    double x0= a/2;
    while (true) {
        double x1 = (x0 + a / x0) / 2;

        if (Math.abs(x1 - x0) < 0.0001) {
            break;
        }
        x0=x1;
    }
    return x0;
}