2013-06-20 67 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