재귀 (Recursion)

Recursion thumbnail.png
재귀는 어떠한 문제를 계산하기 위해 자기 자신에 의존하는 것을 말한다.

모든 재귀 함수는 두 부분을 포함하고 있다.

  1. base case(종료 조건)가 정의 되어 있다. 즉, 재귀가 언제 중지 되어야 하는지 정의되어 있다.
  2. 문제를 더 작은 하위 문제로 나누고, 재귀 호출을 한다.

재귀의 가장 일반적인 예제는 피보나치 수욜이다.

자바스크립트로 구현

function fib(n) {
    if (n <= 1) return n;
    return fib(n-1) + fib(n-2)
}

많은 코딩테스트에서는 이진 검색, 정렬 병합, 트리 탐색, DFS 등에서 많이 재귀를 사용한다. 여기서는 일반적으로 알려져 있지 않은 재귀 문제에 대해서 다뤄본다.

재귀에 대해 기억해야 할 것

기법

Memoization

몇몇 케이스에서는 이전 입력에 대한 결과를 필요로 할 수 있다. 피보나치 수열을 예제로 보면 fib(5)fib(4)fib(3)을 호출하고, fib(4)fib(3)을 호출한다. 즉 fib(3)이 두 번 호출 되었다. 이런 경우 memoization을 이용하면 알고리즘의 효율이 증가하고, 시간 복잡도가 O(n)이 되게 할 수 있다.

필수 문제

추천 연습 문제


참조
Array cheatsheet for coding interviews | Tech Interview Handbook