프로그래밍/프로그래밍언어 16

[4장 고차함수] 4.2 부분함수

부분함수 : 모든 가능한 입력 중, 일부 입력에 대한 결과만 정의한 함수. fun triple(x: Int) = x*3 fun partialTriple(x:Int) : Int = { if(x>100) x*3 else { throw IllegalArgumentException() } } 위의 예시와 같이 100이하의 숫자에 대해서(일부 입력에 대해서) 결과만 정의되어있고, 나머지는 exception을 출력한다. 이러한 함수를 부분함수하고 한다. 연습문제 4-1을 보며 익숙해져보자. 연습문제 4-1 : PartialFunction 클래스에 invokeOrElse 함수와 orElse 함수를 추가해보자. invokeOrElse함수는 입력값 p가 조건에 맞지 않을 때 기본값 default를 반환한다. orElse..

[4장 고차함수] 고차함수란

코틀린에서 함수는 일급함수(first-class function)이다. 일급함수는 함수를 인자로 받거나 반환값으로 반환하는 것이 가능하다. 함수형 프로그래밍에서 말하는 고차함수는, 1. 함수를 매개변수로 받는 함수 2. 함수를 반환하는 함수 다음 두가지 조건 중 하나이상을 만족하면 고차함수(higher order function)라고한다. 예시 // 함수를 인자로 받는 함수 fun highFunc( func: () -> R ) : R { return func() } // 함수를 반환값으로 받는 함수 fun highFunc1() : () -> Unit { return { println("This is Higher Order Function") } } 고차 함수의 장점 1. 간결하게 코드를 짜 재사용성을 높..

[3장 재귀] 3.7 실전 응용 - 멱집합 구하는 함수

꼬리 재귀 멱집합 구하는 버젼을 공부했다. 1. powerset 함수 기본 fun Set.head() = first() fun Set.tail() = drop(1).toSet() fun powerset(s : Set ) : Set = when { s.isEmpty() -> setOf(setOf()) else -> { val head = s.head() val restSet = powerset(s.tail()) restSet + restSet.map{ setOf(head) + it}.toSet() } } 2. powerset 꼬리 재귀 버전 tailrec fun powersetTailrec(s : Set, acc : Set) : Set = when { s.isEmpty() -> acc else -> { p..

[코틀린 설치] kotlin과 kotlin-native 코드 실행

잘모르고 설치했던 코틀린이 kotlin-native라는 것을 알게 되었다. ( 왜냐면 kotlin-native에서는 import java.* 을 할수없고, BigDecimal이 없기 때문이다. import java.math.BigDecimal시 에러 발생한다. ) kotlin-native은 C/C++와 비슷하게 바이너리 파일로 컴파일해주는 것이다. kotlin은 기존 JVM과 동일하게 바이트코드로 변환해준다. kotlin-native로 컴파일하여 실행하려면 # kotlinc-native 연습문제3-17.kt -o 연습문제3-17 # ./연습문제3-17 kotlin으로 실행하려면 # kotlinc 연습문제3-19.kt -include-runtime -d hello.jar # java -jar hello.j..

[3장 재귀] 3.6 상호 재귀를 꼬리 재귀로 최적화하기

상호 꼬리 재귀 = 상호 재귀 + 꼬리 재귀 상호 재귀 : 함수A가 함수B를 호출하고, 함수B가 함수A를 호출하는 상황. (A -> B, B -> A) 예시 : odd, even 함수. odd(999) -> even(998) -> odd(997)... 이런식으로 상호꼬리재귀를 가능하게 하려면 트램펄린(trampoline)을 사용해야 한다고 한다. 스칼라나 클로저 같은 함수형 언어들은 자체적으로 트램펄린을 위한 타입과 기능을 내장하지만, 코틀린은 그러지 못한다고 한다. 그리고 free nomad(이후에 배울 것같다)로 트램펄린 자체를 하나의 타입으로 추상화한다고 한다. trampoline 함수 sealed class B data class Done1(val result : A) : B() data clas..

[3장 재귀] 3.5 꼬리 재귀로 최적화하기

코틀린으로 배우는 함수형 프로그래밍 꼬리 재귀 최적화: tailrec 을 활용 꼬리 재귀- 스택을 쌓으며 진행되는 재귀함수를 반복문으로 진행것과 같이(스택 프레임을 생성X) 컴파일러가 최적화할 수있도록 명시하는 것. 왜 사용하나? : 재귀는 호출이 반복되므로 깊이가 깊어지면 스택 오버플로우가 발생한다. 장점 : 메모이제이션 방법을 사용하지 않고도 성능향상, 스택오버플로우 방지. 조건 : 어떤함수가 직간접적으로 자기 자신을 호출하면서도 그 호출이 함수에서 마지막 연산일때!(그래서 꼬리 재귀) -> 조건부분은 예시로 보시는게 빠르다. 꼬리 재귀 사용안하는 경우 /* 연습문제 3-5 : 숫자를 두 개 입력받은 후 두 번째 숫자를 첫 번째 숫자만큼 가지고 있는 리스트를 반환하는 함수를 만들어보자. 예를 들어 r..

반응형