2015. 12. 28. 10:26ㆍProgramming/Scala
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)