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

问题描述 投票:0回答:3

这是一个作业:

“假设给你一个数字 a,你想找到它的 平方根。一种方法是从一个非常粗略的猜测开始 答案 x0,然后使用以下公式改进猜测 x1 = (x0 + a/x0)/2

例如,如果我们想求 9 的平方根,我们从 x0 = 6 开始, 那么 x1 = (6 + 9/6)/2 = 15/4 = 3.75,更接近。 我们可以重复该过程,使用 x1 计算 x2,依此类推。在这 情况下,x2 = 3.075 且 x3 = 3.00091。所以这很快就收敛了 正确答案(是 3)。

编写一个名为

squareRoot
的方法,该方法采用 double 作为参数,并且 返回参数平方根的近似值,使用此 技术。您不能使用
Math.sqrt

作为您最初的猜测,您应该使用 a/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;
    }
}
java loops while-loop
3个回答
1
投票

你的方法几乎是正确的。

我们先来说说变量。 IMO,您应该使用变量的全名而不是缩写词。使用

guess
代替
gs
。使用
improvedGuess
代替
ig

现在我们可以看到您的问题出在哪里了。为了让 while 循环完成,两次连续猜测的差异必须小于 0.0001。但是,这里您只是比较第 1 和第 2 猜测、第 3 和第 4 猜测、第 5 和第 6 猜测等。如果第 4 和第 5 猜测的差异小于 0.0001 该怎么办?你的循环不会停止。相反,它返回第六个猜测的值。虽然比较准确,但是达不到要求。

这就是我想到的

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;
}

0
投票

这是我的解决方案

public static void searchSq(double a) {
    double x0 = a/2;
    double x1 = 0;

    while (Math.abs(x0-x1) > 0.0001) {
        x1 = x0;
        x0 = (x0+a/x0)/2;
    }
    System.out.println(x1);
}

-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;
}
© www.soinside.com 2019 - 2024. All rights reserved.