더북(TheBook)

이런 변환을 적용하려면 함수가 재귀 호출 다음에 아무 동작도 수행하지 말아야 한다. 이 말이 바로 꼬리 재귀라는 용어가 뜻하는 바다. 함수에 tailrec을 붙였는데 꼬리 재귀가 아니라는 사실을 컴파일러가 발견하면, 컴파일러는 경고를 표시하고 함수를 일반적인 재귀 함수로 컴파일한다. 예를 들어 다음 합계 함수는 sum (array, from + 1, to)를 호출한 결과에 덧셈을 수행하기 때문에 꼬리 재귀가 아니다.

tailrec fun sum(array: IntArray, from: Int = 0, to: Int = array.size): Int {
  // warning: a function is marked as tail-recursive but no tail calls are found  
  // warning: recursive call is not a tail call
  return if (from < to) return array[from] + sum(array, from + 1, to) else 0
}

함수에 tailrec을 붙였는데 함수가 재귀 함수가 아닌 경우에도 컴파일러가 경고를 표시한다.

tailrec fun sum(a: Int, b: Int): Int {
  return a + b // warning: a function is marked as tail-recursive but no tail calls are found
}
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.