알고리즘 문제에 자주 등장하는 재귀에 대해 알아보자.
어떠한 것을 정의할 때 자기 자신을 참조하는 것 (출처: 위키백과)
함수를 정의할 때 자기 자신을 호출하는 함수
재귀 함수는 일반적으로 탈출 조건(base case)과 재귀 조건(recursive case)을 나누어 작성한다.
탈출 조건에서는 주어진 문제를 가장 작은 문제로 나누었을 때의 결과를 반환하고, 재귀 조건에서는 주어진 문제를 한 단계 작은 문제로 나누어 표현한 표현식을 반환한다.
그 형식을 일반화하면 다음과 같다.
const recursive = function(param1, param2, ...) {
// 탈출 조건(base case)
if (가장 작은 문제로 나누었을 때) {
return 가장 작은 문제의 결괏값
}
// 재귀 조건(recursive case)
return 주어진 문제를 작은 문제로 나누어 표현한 것
};
이 형식은 모든 재귀 문제에 적용되지는 않으므로 상황에 따라 적절히 변형해야 한다.
팩토리얼은 그 수보다 작거나 같은 모든 양의 정수의 곱이다. (출처: 위키백과)
예를 들어, 5! = 5 ✕ 4 ✕ 3 ✕ 2 ✕ 1
을 의미한다.
팩토리얼을 JavaScript로 구현하면 다음과 같다.
const factorial = function(num) {
if (num === 1) return 1;
return num * factorial(num - 1);
};
// factorial(5)
// = 5 ✕ factorial(4)
// = 5 ✕ 4 ✕ factorial(3)
// = 5 ✕ 4 ✕ 3 ✕ factorial(2)
// = 5 ✕ 4 ✕ 3 ✕ 2 ✕ factorial(1)
// = 5 ✕ 4 ✕ 3 ✕ 2 ✕ 1
// = 120
피보나치 수열은 첫째 항과 둘째 항의 값은 1이고, 그 다음 항부터의 값은 이전 두 항의 합이 된다.
1, 1, 2, 3, 5, 8, 13, 21 ...
피보나치 수열의 num번째 항을 구하는 함수는 다음과 같다.
const fibonacci = function(num) {
if (num === 1 || num === 2) return 1;
return fibonacci(num - 1) + fibonacci(num - 2);
};
// fibonacci(5)
// = fibonacci(4) + fibonacci(3)
// = (fibonacci(3) + fibonacci(2)) + (fibonacci(2) + fibonacci(1))
// = (fibonacci(2) + fibonacci(1) + 1) + (1 + 1)
// = (1 + 1 + 1) + (2)
// = 5