[코틀린 스터디 10] 0716

ssook·2021년 7월 16일
0
post-thumbnail

✅ 중위함수

  • 중위 표현법(Infix Notation)을 이용한 함수
    보통, 멤버 함수는 Int.toString()으로 사용하는데 이때 뒤에 있는 소괄호와 점을 사용하는 원리가 중위함수 표현법
  • 모든 함수에 쓸 수 있는 것은 아니고 조건이 있음.

    중위 함수의 조건

  1. 멤버 메서드 또는 확장 함수여야 한다.
  2. 하나의 매개변수를 가져야 한다.
  3. infix 키워드를 사용하여 정의해야 한다.
  • 아래는 일반 표현법과 중위 표현법을 비교한 예시이다.
fum main(){
	// 일반 표현법
    val multi = 3.multiply(10)
    // 중위 표현법
    val multi = 3 multiply 10
}

// infix 키워드 추가
// Int를 확장해서 multiply() 함수가 하나 더 추가되었음
infix fun Int.multiply(x: Int): Int {  // infix로 선언되므로 중위 함수
    return this * x
}

✅ 재귀함수에 대해

  • 재귀(recursion)이란

    자기 자신을 다시 참조하는 것을 의미,
    재귀 함수는 다시 자신을 계속 호출하는 특징이 있다.

  • 재귀함수의 필수 조건

  1. 무한 호출에 빠지지 않도록 탈출 조건을 만들어 줌
  2. 스택 영역을 이용하므로 호출 횟수를 무리하게 많이 지정해 연산하지 않는다.
  3. 코드를 복잡하지 않게 한다.

✅ 꼬리 재귀 함수(tail recursive function)

  • 스택에 계속 쌓이는 방식이 함수가 계속 씌워주는 꼬리를 무는 형태
  • 코틀린 고유의 tailrec 키워드를 사용해 선언

아래는 일반적인 재귀함수의 형태이다.

fun main() {
    val number = 4
    val result: Long
    
    result=factorial(number)
    println("Factorial: $number -> result")
}

tailrec fun factorial(n: Int, run: Int = 1): Long {
    return if (n == 1) n.toLong() else factorial(n, factorial(n-1)
}

사용하게 되면 아래와 같이 스택이 쌓인다.

factorial(4)
4factorial(3)
4(3factorial(2))
4
(3(2factorial(1))
4X(3X(2X1)) = 24

아래는 tailrec을 사용한 예제이다.

fun main() {
    val number = 5
    println("Factorial: $number -> ${factorial(number)}")
}

tailrec fun factorial(n: Int, run: Int = 1): Long {
    return if (n == 1) run.toLong() else factorial(n-1, run*n)
}
  • 처음 실행할 때는 factorial(n)을 사용하다 n=1 전까지는 else 구문에 있는 factorial(n-1)을 사용한다.
profile
개발자에서, IT Business 담당자로. BrSE 업무를 수행하고 있습니다.

0개의 댓글