“将此循环封装在一个名为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”一书中的一个练习,它是用递归和算法思考练习的。
答案 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