Python 3.3,在while循环中返回最小值

Ace*_*Ace 2 python loops minimum while-loop

我试图使用牛顿方法返回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))
Run Code Online (Sandbox Code Playgroud)

但是,上面的代码只返回第一次迭代.例如,如果k是2,牛顿方法的准确平方根应该是1.41422,这是第三次迭代.但是,代码当前返回1.5,第一次迭代.如何返回1.41422而不是1.5的更精确的平方根?同样,错误需要反映这种变化.

Gar*_*tty 9

您需要将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
Run Code Online (Sandbox Code Playgroud)

请注意,使用全局范围中的变量就像是一个灾难的配方,它不清楚,意味着你不能轻易使用你的功能.将其作为参数传递.

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
Run Code Online (Sandbox Code Playgroud)