LeetCode题解:69. x 的平方根,牛顿迭代法+迭代,JavaScript,详细注释

原题链接:https://leetcode-cn.com/problems/sqrtx/

解题思路:

  1. 要理解牛顿迭代法,我们需要先回顾一下导数,或者可以看这一篇导数入门
  2. 题解参考了二分查找 + 牛顿法(Python 代码、Java 代码)牛顿迭代法69. x 的平方根-二分查找, 牛顿法
  3. 根据题意,该题是这样一个方程 x 2 = a x^{2}=a x2=a,已知 a a a x x x。可以将其用函数 f ( x ) = x 2 − a f(x)=x^{2}-a f(x)=x2a代替。
  4. 这个函数的导数是 2 x 2x 2x,也就是 2 x 0 = f ( x ) − f ( x 0 ) x − x 0 2x_0=\cfrac{f(x)-f(x_0)}{x-x_0} 2x0=xx0f(x)f(x0)
  5. f ( x ) = 0 f(x)=0 f(x)=0带入,可以得到 2 x 0 = − f ( x 0 ) x − x 0 2x_0=\cfrac{-f(x_0)}{x-x_0} 2x0=xx0f(x0)
  6. f ( x 0 ) = x 0 2 − a f(x_0)=x_0^{2}-a f(x0)=x02a带入,可以得到 2 x 0 = a − x 0 2 x − x 0 2x_0=\cfrac{a-x_0^{2}}{x-x_0} 2x0=xx0ax02
  7. 将等式整理,可以得到 x = x 0 + a x 0 2 x=\cfrac{x_0+\cfrac{a}{x_0}}{2} x=2x0+x0a
/**
 * @param {number} x
 * @return {number}
 */
var mySqrt = function (x) {
  let x0 = x; // 缓存每次迭代的结果,从x开始迭代

  // 用Math.floor将x0*x0向下取整
  // 避免例如TestCase: 5,会出现x0 * x0=5.000000000000001,造成死循环
  while (Math.floor(x0 * x0) > x) {
    // 套用分析得到的迭代公式,不断迭代
    // 当迭代结束时,得到的就是最接近结果的值
    x0 = (x0 + x / x0) / 2;
  }

  // 将结果的整数部分返回
  return Math.floor(x0);
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值