求解,也是面試中經常問的一個問題。該問題有兩種解法:二分法和牛頓法。
首先說二分法,首先給定個初始區間範圍[0,n],因爲一定是在這個範圍內,然後比較這個區間的中值的平方和n,如果小於n,將範圍縮小爲[m,n],如果大於n,將範圍縮小爲[0,]。然後重複這個步驟,直到誤差小於設定的閾值。
代碼如下:
def binary_search(n, e=1e-5):
'''
二分法計算平方根
'''
max = n
min = 0.
mid = (max + min) / 2.
while abs(mid * mid - n) > e:
if mid * mid > n:
max = mid
elif mid * mid < n:
min = mid
else:
return mid
mid = (max + min) / 2.
return mid
然後是牛頓法,牛頓法是一種求函數的0點的方法,對於我們這個問題,如果我們要求的值爲,那麼,於是就轉化成了求的0點。牛頓法的做法是給定的初始值,對求導求出在處的切線,該切線和y軸交點處爲,將更新爲,重複剛纔的過程,使不斷逼近的點。
如下圖所示:
的更新公式推導過程爲:
在處的切線方程爲:
則
於是
代碼如下:
def newton_search(n, e=1e-5):
'''
牛頓法計算平方根
'''
x = n
while abs(x * x - n) > e:
x = (x + n / x) / 2.
return x
運行結果如下所示:
if __name__ == '__main__':
print(binary_search(2))
print(newton_search(2))
1.414215087890625
1.4142156862745097