「」」
實現 int sqrt(int x) 函式。
計算並返回 x 的平方根,其中 x 是非負整數。
由於返回型別是整數,結果只保留整數的部分,小數部分將被捨去。
示例 1:
輸入: 4
輸出: 2
示例 2:
輸入: 8
輸出: 2
說明: 8 的平方根是 2.82842…,
由於返回型別是整數,小數部分將被捨去。
implement int sqrt(int x).
compute and return the square root of x.
「」」
我們要求x2
=ax 2=
a就是求x2
−a=0
x 2−
a=0的解,且x為非負數。
解決sqrt求平方根可以採取牛頓迭代法,下面簡單介紹一下牛頓迭代法,更多的可以自己搜搜。
在曲線上隨便找乙個的a點,(事先不知道根點就是解在那兒,所以隨便找乙個點),做乙個切線,切線的根(就是和x軸的交點)與曲線的根,存在一定的距離。可以從這個切線的根出發,做一根垂線,和曲線相交於b點,繼續重複剛才的工作:可以發現
b點比之前a點更接近曲線的根點。那麼經過多次迭代後會越來越接近曲線的根。
已知曲線方程f(
x)f (x
),在xn
x
n點做切線,求xn
n點的切線方程為:f(
xn)+
f′(x
n)(x
−xn)
f (x
n)+f
′(xn
)(x−
xn)。 要求x
n+1 xn+
1,就求f(
xn)+
f′(x
n)(x
−xn)
=0f (x
n)+f
′(xn
)(x−
xn)=
0的解。
可以得到f(
xn)+
f′(x
n+1)
(x−x
n)=0
f (x
n)+f
′(xn
+1)(
x−xn
)=0=>
=>
xn+1=xn
−f(x
n)f′
(xn)
x n+
1=xn
−f(x
n)f′
(xn)
; 我們將xn+
1 xn+
1代入到x2
−a=0
x 2−
a=0中,可以得到乙個比xn
+1x n+
1更接近與方程的根點(解),多次迭代就可以得到乙個近似於a−
−√a
的x x
。 即x=
(xn+
axn)
2' role="presentation">x=(
xn+a
xn)2
x=(x
n+ax
n)2所以**就如下所示
class
solution
(object):
defmysqrt
(self, x):
""" :type x: int
:rtype: int
"""result = 1.0
while abs(result * result - x) > 0.1:
result = (result + x / result) / 2
return int(result)
至於如何設計逼近的程度,取決於設定的精度。如0.1…..等。
但是如何確定b點就比a點更接近與根點。可以就這題而言,做差最簡單。 |x
n−(x
n+ax
n)2|
−|xn
+1−(
xn+a
xn)2
|>
0 |xn
−(xn
+axn
)2|−
|xn+
1−(x
n+ax
n)2|
>
0xn+
1=xn
−f(x
n)f′
(xn)
x n+
1=xn
−f(x
n)f′
(xn)
就可以得出!
ps:這題雖然簡單,但是確實讓我好學了一把牛頓迭代法!
牛頓迭代 牛頓下山
2009 11 18 16 59 51 分類 計算方法數學類 字型大小 訂閱 牛頓迭代法,牛頓下山迭代 include include float newtonfun float x0,float c float xiashanfun float x0,float c float fun1 floa...
重聚 牛頓迭代
給出n和p,求最小的正整數x使得x p q 有斯特林公式n 2 n n e n 取個log得log n 0.5 log 2 pi n 0.5 log n n 然後log p q q log p 不過二分是過不去的 這個函式可以牛頓迭代,就是對於乙個x,在函式上做切線,與x軸的交點作為下一次的x 複雜...
牛頓法和牛頓迭代法
牛頓法,大致的思想是用泰勒公式的前幾項來代替原來的函式,然後對函式進行求解和優化。牛頓法和應用於最優化的牛頓法稍微有些差別。牛頓法用來迭代的求解乙個方程的解,原理如下 對於乙個函式f x 它的泰勒級數展開式是這樣的 f x f x 0 f x 0 x x 0 frac f x 0 x x 0 2 f...