프로그래밍 공부/Computer Science

[자료구조/ 알고리즘] 재귀: 재귀 함수 / TIL 22일차

Kevinkb 2021. 10. 6. 18:24

재귀

어떤 문제를 해결할 때, 동일한 구조의 더 작은 문제를 해결함으로써 주어진 문제를 해결하는 방법을 재귀(recursion)라고 합니다.

  1. 재귀 함수의 입력값과 출력값 정의하기

재귀 함수를 통해 풀고자 하는 문제, 즉 도달하고자 하는 목표를 정의하는 데 도움이 된다. 재귀적으로 사고하는 데에 가장 먼저 해야 할 일은 문제를 가장 추상적으로 또는, 가장 단순하게 정의하는 것이다.

  1. 문제를 쪼개고 경우의 수를 나누기

주어진 문제를 어떻게 쪼갤지 기준을 정하고, 정한 기준에 따라 문제를 더 큰 경우와 작은 경우로 구분할 수 있는지 확인한다. 일반적으로 입력값으로 이 기준을 정한다. 이때 중요한 관점은 입력값이나 문제의 순서와 크기다. 주어진 입력값 또는 문제 상황을 크기로 구분할 수 있거나, 순서를 명확하게 정할 수 있다면 문제를 구분하는 데 도움이 된다. 그리고 구분된 문제를 푸는 방식이 순서나 크기에 관계없이 모두 같다면, 문제를 제대로 구분한 것이다.

  1. 단순한 문제 해결하기

문제를 여러 경우로 구분한 다음에 가장 해결하기 쉬운 문제부터 해결한다. 이를 재귀의 기초(base case)라고 한다. 재귀의 기초는 재귀 함수를 구현할 때, 재귀의 탈출 조건(재귀 호출이 멈추는 조건)을 구성한다.

  1. 복잡한 문제 해결하기

남아있는 복잡한 경우를 해결한다.

  1. 코드 구현하기

아래는 일반적인 재귀 함수의 템플릿이다.

function recursive(input1, input2, ...) {
  // Base Case : 문제를 더 이상 쪼갤 수 없는 경우
  if (문제를 더 이상 쪼갤 수 없을 경우) {
    return 단순한 문제의 해답;
  }
  // recursive Case
  // 그렇지 않은 경우
  return 더 작은 문제로 새롭게 정의된 문제
  // 예1. someValue + recursive(input1Changed, input2Changed, ...)
  // 예2. someValue * recursive(input1Changed, input2Changed, ...)
}