浮点数的 n次方根:
牛顿迭代法:
pythonclass Solution:
def sqrt_n(self, y, n) -> int:
# f(x)=x**n-y=0
# f`(x)=n*x^(n-1)
# x=x-(x**n-y)/(n*2^(n-1))
if n == 0:
return 1
# x1 的 n1 次方
def pow1(x1, n1):
if n1 == 0:
return 1
y1 = pow1(x1, n1 // 2)
return y1 * y1 if n1 % 2 == 0 else y1 * y1 * x1
x = 1 # 牛顿不动点迭代法
while True:
x2 = x - (pow1(x, n) - y) / (n * pow1(x, n - 1))
if abs(x2 - x) < 1e-6:
break
x = x2
return x2
二分查找:
pythonclass Solution:
def sqrt_n(self, y, n) -> int:
assert n > 0
# x1 的 n1 次方
def pow1(x1, n1):
if n1 == 0:
return 1
y1 = pow1(x1, n1 // 2)
return y1 * y1 if n1 % 2 == 0 else y1 * y1 * x1
# 二分查找,在0到y之间查找
b1, b2 = 0, y
while True:
x = (b1 + b2) / 2
if pow1(x, n) < y - 1e-2:
b1 = x
elif pow1(x, n) > y + 1e-2:
b2 = x
else:
break
return [x,-x]
本文作者:Dong
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!