【问题标题】:Babylonian square root algorithm - initial guess value巴比伦平方根算法 - 初始猜测值
【发布时间】:2017-09-03 14:15:04
【问题描述】:

我一直在寻找用 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 参数。

【问题讨论】:

  • 传入函数参数作为第一个猜测。是调用者做的。
  • 对于num 的合理数字范围,实现看起来没问题。但我敢打赌,对于非常小的数字 (1e-20)、非常大的数字 (1e20)、零或负数,它会给出糟糕的结果或无限期地运行。

标签: javascript algorithm math


【解决方案1】:

estimation 在迭代函数内部定义。

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

iteration 函数中,算法首先检查估计是否正常。

如果不是,则再次调用iteration,但这一次,它首先改进了给定的estimation

return iteration(improvePrecision(estimation));

所以iteration 是递归函数,除非估计足够精确,否则它将调用自身:(isPrecise(estimation))

【讨论】:

    猜你喜欢
    • 2017-09-25
    • 1970-01-01
    • 2020-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多