练习7.2:思考Python

时间:2013-06-20 05:28:08

标签: python algorithm recursion estimation square-root

“将此循环封装在一个名为square_root的函数中,该函数将a作为参数,选择合理的x值,并返回a的平方根的估计值。”

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”一书中的一个练习,它是用递归和算法思考练习的。

4 个答案:

答案 0 :(得分:3)

您不应该在循环体中将x递增1。您应该将x设置为y(查看Wikipedia article并注意x3取决于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在两个值之间振荡,则最后一个版本可能不会终止。

答案 1 :(得分: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

答案 2 :(得分:0)

如果你想要它更抽象创造足够好?并猜测为原语。请参阅此处的http://mitpress.mit.edu/sicp/full-text/sicp/book/node108.html

的SICP经典文本

答案 3 :(得分: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