LeetCode Sqrt(x)

来源:互联网 发布:徐州淘宝店铺装修 编辑:程序博客网 时间:2024/06/17 21:17

用牛顿求根法

首先,选择一个接近函数f(x)零点的x_0,计算相应的f(x_0)和切线斜率f'(x_0)(这里f'表示函数f的导数)。然后我们计算穿过点(x_0, f(x_0))并且斜率为f'(x_0)的直线和x轴的交点的x坐标,也就是求如下方程的解:

f(x_0)= (x_0-x)\cdot f'(x_0)

我们将新求得的点的x坐标命名为x_1,通常x_1会比x_0更接近方程f(x)=0的解。因此我们现在可以利用x_1开始下一轮迭代。迭代公式可化简为如下所示:

x_{n+1} = x_n - \frac{f(x_n)}{f'(x_n)}

已经证明,如果f'是连续的,并且待求的零点x是孤立的,那么在零点x周围存在一个区域,只要初始值x_0位于这个邻近区域内,那么牛顿法必定收敛。 并且,如果f'(x)不为0, 那么牛顿法将具有平方收敛的性能. 粗略的说,这意味着每迭代一次,牛顿法结果的有效数字将增加一倍。

public class Solution {        public int sqrt(int x) {        double a = x, b = 0;        while (Math.abs(b - a) > 1e-6) {            b = a;            a = (b + x / b) / 2;        }                return (int)a;    }}



0 0
原创粉丝点击