gpt4 book ai didi

python - 练习 7.2 : Think Python

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:37:47 25 4
gpt4 key购买 nike

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

最佳答案

您不应该在循环体中将 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 在两个值之间振荡,最后一个版本可能不会终止。

关于python - 练习 7.2 : Think Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17205927/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com