카샤의 만개시기

코틀린 재귀함수 tailrec 본문

Kotlin

코틀린 재귀함수 tailrec

SKaSha 2019. 8. 2. 12:18

Java에서 재귀함수를 사용하게되면 함수가 함수를 호출하면서 콜스택이 계속 적재되어 stack overflow 현상이 일어나기도 하고, 콜 스택 생성에 따른 성능 저하를 경험하기도 합니다.

꼬리 재귀

재귀 함수를 구현할 때 마지막(Tail)에 자기 자신을 호출(Recursion)하는 형태의 함수

kotlin에서 꼬리 재귀를 사용하게 되면 자바에서 있었던 이런 문제들을 해결할 수 있으며 적절하지 않은 코드가 작성이 되었을때 warning도 받을 수 있습니다.

다음과 같은 재귀함수를 작성하였고, 함수의 앞 부분에는 tailrec 예약어를 붙였습니다.

tailrec fun tailrecPrint(no: Int = 1, count: Int = 1) {
    println("tailrecPrint")
    return if(no == count) return else tailrecPrint(no - 1, count)
}
fun main(args: Array<String>) {
    tailrecPrint(3)
}

위에서 작성한 코틀린 재귀함수 코드가 자바로 변형된 결과는 다음과 같습니다

public static final void tailrecPrint(int no, int count) {
    while(true) {
        String var2 = "tailrecPrint";
        System.out.println(var2);
        if (no == count) {
            return;
        }
        --no;
    }
}

변형된 함수를 보면 재귀호출 코드는 사라지고 일반 반복문으로 변경되면서 콜 스택 생성에 따른 성능저하나, stack overflow 문제로부터 자유로워질 수 있습니다.

'Kotlin' 카테고리의 다른 글

코틀린 제네릭 (가변성, 스타 프로젝션, reified)  (0) 2019.11.30
코틀린 object  (0) 2019.08.02
코틀린 한정클래스 (Sealed)  (0) 2019.08.02
코틀린 Unit vs Nothing  (0) 2019.08.02
코틀린 lateinit과 by lazy  (0) 2019.07.23
Comments