【发布时间】:2015-01-11 07:51:51
【问题描述】:
我正在研究计算机程序的结构和解释。
在第 页。 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。我知道它是如何崩溃的,但我不明白它为什么会这样。
在我的“a_try”函数中,每个“next”都是“guess”的两倍。当我打印出每次迭代的“猜测”和“下一个”时,我的下一个猜测只会不断翻倍。所以整数溢出到底。p>
为什么?我的代码有什么问题?我的逻辑有什么问题? 谢谢你的时间。请帮忙。
【问题讨论】:
-
整数在 Python 中不会溢出。他们只是不断成长。 (好吧,最终你会得到一个
MemoryError,但它们不会翻转到 0。)所以,你对问题的描述不可能是正确的。但是,您显然要转换到某个地方(希望足够早)或sqrt(2)必须是1,所以这并不真正相关。 -
也许在顶部添加
from __future__ import division? -
我对这应该如何工作感到困惑。任何地方都没有发生平方,所以,即使它收敛了,它如何收敛到平方根? (您的
deriv和newton_transform函数看起来不错,我只是不明白您要在这里转换的内容。)如果没有看到您正在移植的 Scheme 代码,很难猜出缺少什么 -
其实,这就是问题的全部……等一下。
标签: python newtons-method