问题:实现平方根函数,不得调用其他库函数。
一、使用二分法实现
def mySqrt2(num):
if num<0:
return None
if num==0:
return 0
pre=1e-7 #精度
low=0.0
high=num
while high-low>pre:
mid=(low+high)/2
squre=mid*mid
if squre>num:
high=mid
else:
low=mid
return (low+high)/2
二、使用牛顿法迭代法实现
根据牛顿法,求
A−−√
A
即求
f(x)=x2−A
f
(
x
)
=
x
2
−
A
的非负根,
f′(x)=2x
f
′
(
x
)
=
2
x
,
所以,此时的牛顿递推式为:
xk+1=xk−x2k−A2xk=x2k+A2xk
x
k
+
1
=
x
k
−
x
k
2
−
A
2
x
k
=
x
k
2
+
A
2
x
k
,当
xk+1
x
k
+
1
小于预指定的精度时,可以退出迭代。具体代码实现如下:
def mySqrt2(num):
if num<0:
return None
if num==0:
return 0
pre=1e-7
x0,x1=float(num),0.0
while True:
x1=(x0*x0+num)/(2*x0)
if x1*x1-num<=pre and x1*x1-num>=-pre:
return x1
x0=x1
算法思想:改进的牛顿迭代法(先迭代求出接近x的数,在用牛顿迭代法迭代10次求解)
def mySqrt(num):
if num==0:
return 0
i=0.0
x1,x2=0.0,0.0
while i*i<=num:
i+=0.1
x1=i
for j in range(10):
x2=num
x2/=x1
x2+=x1
x2/=2
x1=x2
return x2