2017-10-30 9 views
4
fun fact(x: Int): Int{ 
    tailrec fun factTail(y: Int, z: Int): Int{ 
     if (y == 0) return z 
     else return factTail(y - 1, y * z) 
    } 
    return factTail(x, 1) 
} 

누군가가 내게 어떻게 위의 재귀 함수가 kotlin에서 작동하는지 설명해 주시겠습니까?코 틀린 회귀

+1

Kotlin의'tailrec'은 함수 오버 플로우를 방지합니다. 이 수정자는 컴파일러에서이를 최적화하는 데 사용됩니다. –

+3

나는 "기능 계승"이 Kotlin의 말에서 "재미있는 사실"로 변하는 것을 좋아합니다. – bipll

답변

1

tailrec 키워드는 루프가있는 함수를 표현하려고 시도하는 컴파일러의 최적화로만 사용되며 stack overflow의 위험을 피하기 위해 재귀를 사용하지 않는다고 말하기 시작합니다. 우리는 재귀를 피하기 경우

함수는 다음과 같이 뭔가를 볼 수 있었다 :

fun fact(x: Int): Int { 
    var result = x 
    for (i in x - 1 downTo 1) { 
     result *= i 
    } 
    return result 
} 
4

유래 당신이 코 틀린에 재귀를 사용하여 큰 위험이 있습니다. 위의 이미지 재귀으로

stack

는 코 틀린 작동합니다. 스택의 최대 크기가 있습니다. 우리의 재귀 함수가 무한 할 경우 최대 크기를 넘어서고 StackOverflow 예외가 발생합니다. 따라서 재귀를 사용하지 말고 루프를 사용하십시오.

+0

당신이 언급하는 그 위험은 Kotlin만이 아닙니다. – Enzokie