Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 这是一个有效的while循环吗?_Java_Loops_While Loop - Fatal编程技术网

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

Java 这是一个有效的while循环吗?,java,loops,while-loop,Java,Loops,While Loop,这是一份作业: “假设给你一个数字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作为参数 返回参数平方根的近似值,使用 技术

这是一份作业:

“假设给你一个数字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
来计算绝对值。”

这是一个循环练习。正如你所看到的,我做了作业,我认为它有效吗?但我不确定我是如何找到解决方案的?换句话说,我应该在这里改进什么?是否有其他不同的方式进入循环?如何更恰当地命名变量?最后,我的方法是好还是坏

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

你的方法几乎是正确的

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

现在我们可以看到你的问题所在了。要完成while循环,两次连续猜测的差值必须小于0.0001。但是,这里您只比较了第一次和第二次猜测、第三次和第四次猜测、第五次和第六次猜测等。如果第四次和第五次猜测的差值小于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;
}

你的方法几乎是正确的

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

现在我们可以看到你的问题所在了。要完成while循环,两次连续猜测的差值必须小于0.0001。但是,这里您只比较了第一次和第二次猜测、第三次和第四次猜测、第五次和第六次猜测等。如果第四次和第五次猜测的差值小于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;
}
这是我的解决办法

  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;
}
专用静态双平方根(双a){
双x0=a/2;
while(true){
双x1=(x0+a/x0)/2;
if(数学绝对值(x1-x0)<0.0001){
打破
}
x0=x1;
}
返回x0;
}
这是我的解决方案

  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;
}
专用静态双平方根(双a){
双x0=a/2;
while(true){
双x1=(x0+a/x0)/2;
if(数学绝对值(x1-x0)<0.0001){
打破
}
x0=x1;
}
返回x0;
}

您可以随意命名变量。如果您不确定代码的功能,请编写一些测试用例如果您需要编写注释来说明缩写的含义,您可能不应该使用缩写。调用变量
guess
。长名字比不清楚的短名字好。你看到了
ig=(gs+(a/gs))/2和
ig1=(ig+(a/ig))/2在循环内外是如何重复的吗?这意味着您可能应该使用
do…while
循环。不过你需要重写一下。你可以随意命名你的变量。如果您不确定代码的功能,请编写一些测试用例如果您需要编写注释来说明缩写的含义,您可能不应该使用缩写。调用变量
guess
。长名字比不清楚的短名字好。你看到了
ig=(gs+(a/gs))/2和
ig1=(ig+(a/ig))/2在循环内外是如何重复的吗?这意味着您可能应该使用
do…while
循环。不过你需要重写一下。我知道我的代码有问题,但我不能像你那样用文字表达出来!你的方法好一点,我想:“如果你认为我的答案回答了你的问题,请考虑点击这个复选框来接受它。”MiljanI知道我的代码有什么进展,但我不能把它像你一样说出来。你的方法好一点,我想:“如果你认为我的答案回答了你的问题,请考虑通过点击那个标记来接受它。在循环中。您应该创建一个临时布尔值并使用适当的命名变量。您完全正确,但这个问题来自《思考Java》一书。我根据书中练习中的变量命名变量。使用'while(true)'和'break;'在循环中。您应该创建一个临时布尔值并使用适当的命名变量。您完全正确,但这个问题来自《思考Java》一书。我根据书中练习中的变量命名变量。