scala/functional programming
-
1.7 꼬리 재귀scala/functional programming 2024. 4. 4. 20:53
tail recursion: If a function calls itself as its last action, the function's stack frame can be reused. Exercise factorial() 을 꼬리재귀 버전으로 구현하라. import scala.annotation.tailrec def factorial(n: Long): Long = { @tailrec def fact(n: Long, acc: Long): Long = if (n == 0) acc else fact(n - 1, n * acc) fact(n, 1) } @main def Main(): Unit = { val r = factorial(10) println(r) }
-
1.6 블록과 어휘 범위scala/functional programming 2024. 4. 4. 19:58
예제: 뉴턴의 방법 의 코드 문제는 너무 많은 function 이 있다는 점이다. sqrt() function 안으로 관련 코드를 넣고, 기존에 중복으로 사용된 x 값을 조정하면 아래처럼 개선할 수 있다. def abs(x: Double): Double = if x > 0 then x else -x def sqrt(x: Double): Double = { def isGoodEnough(guess: Double): Boolean = abs(guess * guess - x) < 0.001 def improve(guess: Double): Double = (guess + x / guess) / 2 def sqrtIter(guess: Double): Double = if isGoodEnough(guess) th..
-
1.5 예제: 뉴턴의 방법을 사용한 제곱근scala/functional programming 2024. 4. 4. 19:48
뉴턴의 방법 알고리즘 sqrt(x) = y 를 구하기 위해 1. 초기 예측값 선정 (y=1 로 선택) 2. 다음 예측값 = mean(y, x/y) 을 반복하다 보면 점점 정확해 짐 예제 sqrt(2) 를 계산해 보자. EstimationQuotientMean Estimation Quotient Mean 1 2 / 1 1.5 1.5 2 / 1.5 = 1.333 1.4167 1.4167 2 / 1.4167 1.4142 1.4142 ... ... 코드 def abs(x: Double): Double = if x > 0 then x else -x def isGoodEnough(x: Double, guess: Double): Boolean = abs(guess * guess - x) < 0.001 def impr..
-
1.4 조건과 값 정의scala/functional programming 2024. 4. 4. 19:47
Short circuit evaluation 표현식을 평가하지 않아도 결과를 알 수 있는 것을 단락평가(short circuit evaluation) 이라고 한다. 다음 예를 보자. false && e // false (e 의 평가와 관계 없이) true || e // true (e의 평과와 관계 없이) Value definitions def loop: Boolean = loop val x = loop // infinite loop def x = loop // OK 다음 function 을 if 를 사용해 구현해 보자. and(x, y) == x && y call by value 구현 def and(x: Boolean, y: Boolean): Boolean = if x then y else false d..
-
1.3 평가 전략 및 종료scala/functional programming 2024. 4. 4. 19:47
평가(Evaluation) 종료 call by value 로 expression 이 종료되면, call by name 으로도 expression 이 종료된다. 그러나 call by name 으로 expression 이 종료된다고 해서, 항상 call by value 로 expression 이 종료되는 것은 아니다. 다음 예를 살펴보자 def loop: Int = loop def first(x: Int, y: Int) = x call by value first(1, loop) x=1 과 loop 가 evaluation 되어 expression 이 종료되지 않는다. call by name first(1, loop) x=1 만 evaluation 되어 (loop 는 evaluation 되지 않고) expres..
-
1.2 프로그래밍의 요소scala/functional programming 2024. 4. 4. 19:47
치환 모델 (substitution model) substitution model: evaluation 을 통해 expression 을 value 로 reduce 하는 과정 그러면 모든 expression 은 value 로 reduce 될 수 있을까? 다음 예를 보면 아니라는 것을 알 수 있다. def loop: Int = loop loop Call by value vs Call by name def test(x:Int, y:Int) = x * x 위의 코드에서 call by name 과 call by value 중 어느것이 더 유리할까? 연산 횟수를 비교해 보자 code #steps of call by value #steps of call by value test(2,3) 1번 1번 test(3+4, ..