2016-11-25 56 views
0

这里是一个任务:这是一个有效的while循环吗?

“比方说,给你一个号码,和你想找到它的 平方根一个这样做的方式是从一个非常粗略的估计大约 了答案, 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。所以这是收敛的g很快就在 的正确答案(这是3)。

编写一个名为squareRoot的方法,该方法以双精度参数和 为参数,使用此技术返回参数平方根的近似值。您不得使用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; 
    } 
} 
+0

您可以命名任何你想要的变量。如果您不确定代码的功能,请编写一些测试用例 –

+0

如果您需要撰写评论以说明缩写的含义,则可能不应使用缩写。调用变量'guess'。长名称比不清楚的短名称更好。 – Carcigenicate

+0

你会看到'ig =(gs +(a/gs))/ 2'和'ig1 =(ig +(a/ig))/ 2'在循环的内部和外部是如何复制的?这意味着你可能应该使用'do ... while'循环。不过你需要重写一下。 – Carcigenicate

回答

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

我知道我的代码正在发生什么,但是我不能像你那样把它写成文字!你的方式更好一些,我猜:) – Miljan

+0

如果你认为我的答案回答你的问题,请考虑通过点击勾号@Miljan – Sweeper

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

来接受它。使用'while(true)'和'break ;”在循环内。您应该创建一个临时布尔值并使用适当的命名变量。 – Odrai

+0

你是绝对正确的,但是这个问题来自“Think Java”这本书。我根据书中练习中的变量命名变量。 –