2012-11-06 2 views
2

Newton의 방법을 사용하여 k의 제곱근에 대해 가장 작은 값을 반환하려고합니다.while 루프에서 가장 작은 값을 반환하는 Python 3.3

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이면 Newton의 방법에 의한 정확한 제곱근은 1.41422가되어야하며 이는 세 번째 반복입니다. 그러나 코드는 현재 1.5 번째 반복을 반환합니다. 1.5 대신 1.41422의 더 정확한 제곱근을 반환하려면 어떻게합니까? 마찬가지로 오류는이 변경 사항을 반영해야합니다.

+1

을 정확하게 당신이 첫 번째 반복에, 때 발생하는 것으로 예상 할 무엇을 : 당신이 처음에 한 번 검사를 할 수 있도록 k 오히려 반복 모든보다는, 루프 내에서 변경하는

는 또한 불가능 루프의'return x' ('x = 1.5'와 함께)가 맞았습니까? – Ben

답변

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 

주, 그것은 불분명 귀하의 기능을 쉽게 사용할 수 없음을 의미합니다. 대신 매개 변수로 전달하십시오.

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