我正在学习计算机程序的结构和解释。
in pg。如图73所示,它使用牛顿法作为构造高阶程序的例子。
这是我的代码:
def deriv(g):
dx = 0.00001
return lambda x: (g(x + dx) - g(x)) / dx
def newton_transform(g):
return lambda x: x - g(x) / deriv(g)(x)
def fixed_point(f, guess):
def close_enough(a, b):
tolerance = 0.00001
return abs(a - b) < tolerance
def a_try(guess):
next = f(guess)
if close_enough(guess, next):
return next
else:
return a_try(next)
return a_try(guess)
def newton_method(g, guess):
return fixed_point(newton_transform(g), guess)
def sqrt(x):
return newton_method(lambda y: x / y, 1.0)
print sqrt(2)
代码会崩溃并给我ZeroDivisionError。我知道它是如何崩溃的,但我不明白为什么它会像它一样。
在我的&#34; a_try&#34;功能,每一个&#34; next&#34;是&#34;猜测&#34;的加倍值。当我打印出来&#34;猜测&#34;和&#34; next&#34;每次迭代,我的下一个猜测只是保持加倍。所以整数溢出到最后。
为什么呢?我的代码出了什么问题?我的逻辑出了什么问题? 谢谢你的时间。请帮忙。
答案 0 :(得分:1)
使用牛顿的方法来查找sqrt(2)
- 即y**2 == 2
- 首先编写g(y) = y**2 - 2
,然后使用newton_transform
对其进行迭代,直到它收敛为止
您的deriv
和newton_transform
没问题,您的fixed_point
实际上会迭代newton_transform
直到它收敛 - 或直到您达到递归限制,或直到您下溢浮动操作。在你的情况下,它是最后一个。
为什么呢?好吧,看看你的g(y)
:它是2/y
。我不知道你从哪里得到的,但是g / g'
只是-y
,所以牛顿变换是y - -y
,显然不会收敛。
但如果您插入y**2 - 2
,那么g/g'
上的转换将会收敛(至少对于大多数值而言)。
所以:
def sqrt(x):
return newton_method(lambda y: y**2-x, 1.0)