본문 바로가기
Programming/Scala

Square roots with Newton's method - Coursera ppt 번역

by 유주원 2015. 12. 28.

Task


이번 세션에서는 아래의 함수를 정의할 것이다.


def sqrt(x: Double): Double = ...


Newton's method를 이용하여 연속적인 호출로 값을 추산할 것이다.


Method


sqrt(x)를 계산하기 위해서는


- 초기 값 y와 함께 시작이 되어야 한다.( 초기 y 값을 1이라고 정의하자.)

- y의 평균 값과 x/y 값을 반복적으로 계산함으로써 값의 추정을 향상시킨다.


Example: x가 2일때,


추정값                   몫                                 평균

1                      2/1 = 2                        1.5 ( (1 + 2) / 2)

1.5                   2/1.5 = 1.333                 1.4167 ((1.5 + 1.333) / 2)

1.4167               2/1.4167 = 1.4118           1.4142 ((1.4167 + 1.4118)/2)

1.4142               ...                               ...


Implementation in Scala


우선, 반복적 계산을 하기위한 함수를 정의한다.


def sqrtIter(guess: Double, x: Double): Double =

    if (isGoodEnough(guess, x)) guess

   else sqrtIter(improve(guess, x), x)


sqrtIter는 재귀 함수이며 Scala에서는 명확한 return type이 명시되어야 한다. 비재귀 함수에서는 return type은 선택적이다.


두번째로, 추정 계산의 값을 향상시키기 위한 improve 함수와 종료 조건을 위한 isGoodEnough 함수를 정의한다.

 

def improve(guess: Double, x: Double) =

    (guess + x / guess) /2


def isGoodEnough(guess: Double, x: Double) = 

    abs(guess * guess - x) < 0.001


마지막으로 sqrt 함수를 정의한다.


def sqrt(x: Double) = sqrtIter(1.0, x)