2

“将此循环封装在一个名为 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)

最多为 'a' 加上 33,它估计正确的平方根。之后,它开始呈指数级增长,当我为“a”发送 100 时,它猜测平方根约为 18。我不知道这是否是估计的本质。我知道如何找到精确的平方根,但这是“Think Python”一书中的一个练习,它用于练习递归和算法思考。

4

4 回答 4

3

您不应该x在循环体中增加 1。您应该设置xy(查看Wikipedia 文章并注意如何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 在两个值之间波动,最后一个版本可能不会终止。

于 2013-06-20T05:49:21.353 回答
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
于 2014-08-24T19:25:13.250 回答
0

如果您希望它更抽象,请创建足够好?并猜测为原语..请参阅此处的 SICP 经典文本http://mitpress.mit.edu/sicp/full-text/sicp/book/node108.html

于 2013-06-20T07:58:45.800 回答
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
于 2016-03-08T15:38:32.950 回答