Python 3.3, возвращая наименьшее значение в цикле while
Я пытаюсь вернуть наименьшее значение для квадратного корня из k, используя метод Ньютона.
k=float(input("Number? "))
x = k/2
def newton(x):
while abs(x**(1/2)- k) >= 10**(-10):
if k >= 0:
x = (x+k/x)/(2)
return x
elif k < 0:
raise ValueError ("Cannot take the square root of a negative number")
print ("The approximate square root of", k, "is", newton(k))
print ("The error is", abs(x**(1/2)- k))
Однако приведенный выше код возвращает только первую итерацию. Например, если k равно 2, точный квадратный корень по методу Ньютона должен быть 1,41422, что является третьей итерацией. Тем не менее, код в настоящее время возвращает 1.5, первая итерация. Как мне вернуть более точный квадратный корень из 1,41422 вместо 1,5? Аналогично, ошибка должна отражать это изменение.
1 ответ
Вы должны разместить свой return
оператор вне вашего цикла, в противном случае он всегда будет возвращаться на первой итерации:
def newton(x):
while abs(x**(1/2)- k) >= 10**(-10):
if k >= 0:
x = (x+k/x)/(2)
elif k < 0:
raise ValueError ("Cannot take the square root of a negative number")
return x
Обратите внимание, что использование переменных из глобальной области видимости - это путь к катастрофе, это неясно и означает, что вы не можете использовать свою функцию так легко. Вместо этого передайте его как параметр.
Это также невозможно для k
изменить внутри цикла, чтобы вы могли выполнять проверку один раз в начале, а не на каждой итерации:
def newton(x, k):
if k < 0:
raise ValueError ("Cannot take the square root of a negative number")
while abs(x ** (1 / 2) - k) >= 10 ** (-10):
x = (x + k / x) / 2
return x