题目
解题
- 方法一 牛顿法
- 方法二
牛顿法
公式(1):
x
n
+
1
=
x
n
−
f
(
x
n
)
f
′
(
x
n
)
x_{n+1} = x_n - \frac{f(x_n)}{f'(x_n)}
xn+1=xn−f′(xn)f(xn)
而这题官方给出的公式(2)是:
x
i
+
1
=
1
2
(
x
i
+
x
x
i
)
x_{i+1} = \frac{1}{2}(x_i + \frac{x}{x_i})
xi+1=21(xi+xix)
为什么?
这题给的题目是求解平方根,其实相当于求解公式(3):
f
(
x
)
=
x
2
−
a
f(x)=x^2-a
f(x)=x2−a
当
f
(
x
)
=
0
f(x)=0
f(x)=0时,
a
a
a就是方程的实数解
开始使用数学武器:
a.
f
′
(
x
)
=
2
x
f'(x)=2x
f′(x)=2x,把
2
x
2x
2x带入到公式(1)里,得近似解公式(4):
x
−
f
(
x
)
2
x
{x- \frac{f(x)}{2x}}
x−2xf(x)
b. 把公式(3)带入公式(4)里,得
x
−
(
x
2
−
a
)
2
x
{x- \frac{(x^2-a)}{2x}}
x−2x(x2−a),化简得公式(5):
1
2
(
x
+
a
x
)
\frac{1}{2}(x + \frac{a}{x})
21(x+xa)
所以官方给出了公式(2),其实牛顿法就是不断迭代的过程,先给一个不管多么离谱的近似解,然后带进公式,按照计算出的公式不断迭代,直到到达最接近的近似解,此时就是答案。
code:
官方解:
class Solution:
def mySqrt(self, x: int) -> int:
if x < 2:
return x
x0 = x
x1 = (x0 + x / x0) / 2
while abs(x0 - x1) >= 1:
x0 = x1
x1 = (x0 + x / x0) / 2
return int(x1)
结果:
更好的代码:
class Solution:
def mySqrt(self, x):
"""
:type x: int
:rtype: int
"""
if x <= 1:
return x
r = x
while r > x / r:
r = (r + x / r) // 2
return int(r)
这个结果都挺好的
袖珍计算器算法
这是官方叫法,其实就是换个公式:
x
=
e
1
2
l
o
g
x
\sqrt{x} = e^{\frac{1}{2}logx}
x=e21logx
code:
from math import e, log
class Solution:
def mySqrt(self, x):
if x <2:
return x
left = int(e ** (0.5 * log(x)))
right = left + 1
if right * right > x:
return left
else:
return right
要我说都import math 为啥不用sqrt
结果:
速度还挺快…
3.10
over