2013-06-20 103 views
2

「將此循環封裝在一個名爲square_root的函數中,該函數以參數爲參數,選擇合理的x值,並返回a的平方根估計值。」練習7.2:Think Python

def square_root(a): 
    x = 2 
    y = (x + a/x)/2 
    epsilon = 0.00000000001 
    if abs(y - x) < epsilon: 
     print y 
    while abs(y - x) > epsilon: 
     x = x + 1 
     y = (x + a/x)/2 
     break 
    else: 
     return 
    print y  
square_root(33) 

最多把33 'A',它估計正確的平方根。在那之後,它開始以指數形式跳躍,直到當我發送'a'爲100時,它猜測平方根約爲18.我不知道這可能是估計的性質。我知道如何找到精確的平方根,但是這是來自「Think Python」一書的練習,它是通過遞歸和思考的算法實踐的。

+0

爲什麼你在你的'while'循環體直接有'break'? – Blender

+0

它不會給我任何其他的東西,只是空白。它會運行,但不會打印'y' – troychroi

回答

3

您不應該在循環體中將x加1。您應該設置xy(看Wikipedia article並注意取決於x2,等等):

while abs(y - x) > epsilon: 
    x = y 
    y = (x + a/x)/2 

你想擺脫break的爲好,因爲它使你的while循環毫無意義。您的最終代碼將是:

def square_root(a): 
    x = 2 
    y = (x + a/x)/2 
    epsilon = 0.00000000001 
    if abs(y - x) < epsilon: 
     print y 
    while abs(y - x) > epsilon: 
     x = y 
     y = (x + a/x)/2 
    print y 

但仍有改進的餘地。以下是我會寫:

def square_root(a, epsilon=0.001): 
    # Initial guess also coerces `a` to a float 
    x = a/2.0 

    while True: 
     y = (x + a/x)/2 

     if abs(y - x) < epsilon: 
      return y 

     x = y 

此外,由於Python的浮點類型不具有無限的精度,你只能得到大約15位精度反正,所以你還不如干脆刪除epsilon

def square_root(a): 
    x = a/2.0 

    while True: 
     y = (x + a/x)/2 

     # You've reached Python's max float precision 
     if x == y: 
      return x 

     x = y 

但是如果y在兩個值之間擺動,則最後一個版本可能不會終止。

+0

謝謝。這非常有幫助。 – troychroi

1

這是另一種方式;它只是更新x而不是使用y。

def square_root(a): 
    x = a/2.0 
    epsilon = 0.00000001 
    while abs(a - (x**2)) > epsilon: 
     x = (x + a/x)/2 
    return x 
0

這麼簡單,只是把X = A,然後按照neuton公式是這樣的:

def square_root(a): 
x = a 
while True: 
    print x 
    y = (x+a/x)/2 
    if abs(y-x) < 0.0000001: 
     break 
    x = y