6

下面的代码应该使用 Heron 的方法返回平方根。我试图在其中找到一个“错误”,但老实说,我无法发现它。我对“var prevGuess = n”语句有疑问。“n”第一次如何工作?那是错误吗,“修复”是什么?

谢谢,我现在有点迷茫......

function heronSqrt(n)
{
    var DELTA = 1.0E-10;
    var nextGuess;
    var prevGuess = n;
    do
    {
        nextGuess = (prevGuess + (n/prevGuess))/2;
        prevGuess = nextGuess;
    } while (nextGuess-prevGuess > DELTA)
    return nextGuess;
}
4

1 回答 1

3

这是一个工作版本:

function heronSqrt(n)
{
    var DELTA = 1.0E-10;
    var nextGuess  = n;
    var prevGuess;
    do
    {
        prevGuess = nextGuess;
        nextGuess = (prevGuess + (n/prevGuess))/2;
    } while (Math.abs(nextGuess-prevGuess) > DELTA)
    return nextGuess;
}

有两个问题。首先,您在进行限制检查之前更新了“prevGuess” 。其次,您需要检查猜测之间差异的绝对值。我更改了初始化,以便将“nextGuess”初始化为输入值,将“prevGuess”的更新移动到循环的第一行,并将调用添加到Math.abs().

为了使这项工作适用于更大范围的值,我认为您需要让“DELTA”的值与“n”的大小成正比。如果您尝试使用大量数字,它可能不会收敛。

于 2013-08-07T16:14:26.580 回答