我正在通過計算機程序的結構和解釋工作。牛頓法:使用Python構建高階程序
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。我知道它是如何崩潰的,但我不明白它爲什麼會這樣。
在我的「a_try」函數中,每個「next」都是「guess」的兩倍。當我打印每個迭代的「猜測」和「下一個」時,我的下一個猜測就是保持加倍。所以最後整數溢出。
爲什麼?我的代碼有什麼問題?我的邏輯有什麼問題? 謝謝你的時間。請幫忙。
整數不會溢出Python編寫的。他們只是在不斷增長。 (好吧,最終你會得到一個'MemoryError',但它們不會回滾到0.)所以,你對這個問題的描述是不正確的。然而,你顯然正在轉換到某個地方(希望足夠早),或者'sqrt(2)'必須是'1',所以這並不重要。 – abarnert
也許在頂部工作中加入'from __future__ import division'? – Wilbeibi
我很困惑這應該如何工作。沒有平方發生在任何地方,所以,即使這樣做會聚,它如何會聚到平方根? (你的'deriv'和'newton_transform'函數看起來很好,我只是沒有得到你想要在這裏轉換的東西。)沒有看到Scheme代碼,你正在移植它很難猜測什麼是丟失 – abarnert