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
Другие вопросы по тегам