2017-09-03 76 views
0

我一直在寻找用JavaScript编写的巴比伦平方根的算法,并发现这个工作的解决方案:巴比伦平方根算法 - 初始估计值

function sqrt(num) { 
    var accuracy = 0.000001; 

    function isPrecise(estimation) { 
    if (Math.abs(Math.pow(estimation, 2) - num) < accuracy) { 
     return true 
    } else { 
     return false 
    } 
    } 

    function improvePrecision(estimation) { 
    return (estimation + (num/estimation))/2; 
    } 

    function iteration(estimation) { 
    if(isPrecise(estimation)) { 
     return estimation; 
    } else { 
     return iteration(improvePrecision(estimation)); 
    } 
    } 

    return iteration(num); 
} 

,但我看不出哪里是初始猜测(代码 - estimation)值被定义。那么当第一次迭代没有猜测值时它是如何工作的?其实这个值应该等于num的说法。

+0

将函数参数作为第一个猜测输入。这是它的来电者。 – duffymo

+0

对于'num'的合理数字范围,该实现看起来不错。但我敢打赌,它会给很差的结果或无限期地运行非常小的数字(1e-20),非常大的数字(1e20),零或负数。 –

回答

1

estimation在迭代函数内部定义。

函数第一次运行时,将使用num参数return iteration(num)调用迭代函数。

Inside iteration功能,该算法首先检查估计是否正常。

如果没有,iteration再次调用,但是这一次,它首先提高了给定estimation

return iteration(improvePrecision(estimation));

所以iteration是递归函数,它会调用本身,除非估计不够精确:(isPrecise(estimation)