재귀란
원래의 자리로 되돌아가거나 되돌아옴.
재귀함수는 자기 자신을 호출하는 함수
function recursion () {
console.log("This is")
console.log("recursion!")
recursion()
}
재귀는 언제 사용
- 주어진 문제를 비슷한 구조의 더 작은 문제로 나눌 수 있는 경우
- 중첩된 반복문이 많거나 반복문의 중첩 횟수(number of loops)를 예측하기 어려운 경우
예시)
for (let i = 0; i < n; i++) {
for (let j = 0; j < n; j++) {
for (let k = 0; k < n; k++) {
for (let l = 0; l < n; l++) {
for (let m = 0; m < n; m++) {
for (let n = 0; n < n; n++) {
for (let o = 0; o < n; o++) {
for (let p = 0; p < n; p++) {
// do something
someFunc(i, j, k, l, m, n, o, p);
}
}
}
}
}
}
}
}
재귀로 문제 해결
1. 문제를 좀 더 작게 .
2. 문제가 더는 작아지지 않을 때까지, 가장 작은 단위.
3. 가장 작은 단위의 문제를 풂으로써 전체 문제를 해결.
단,
재귀 함수는 자신을 무한히 연쇄 호출하므로 호출을 멈출 수 있는 탈출 조건을 반드시 만들어야 한다. 탈출 조건이 없는 경우, 함수가 무한 호출되어 stackoverflow 에러가 발생
-> base case와 recusive case를 생각해 만든다.
base case : 문제를 더 이상 쪼갤 수 없을 때.
recusive case : 그렇지 않은 경우
ex)
// 피보나치 수열
// 피보나치 수는 0과 1로 시작하며, 다음 피보나치 수는 바로 앞의 두 피보나치 수의 합이 된다.
// 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, ...
function fibonacci(n) {
if (n < 2) return n; // base case
return fibonacci(n - 1) + fibonacci(n - 2); // recusive case
}
// 팩토리얼
// 팩토리얼(계승)은 1부터 자신까지의 모든 양의 정수의 곱이다.
// n! = 1 * 2 * ... * (n-1) * n
function factorial(n) {
if (n < 2) return 1; // base case
return factorial(n - 1) * n; // recusive case
}
'Learn > Javascript' 카테고리의 다른 글
재귀함수 추가학습 (0) | 2023.02.16 |
---|---|
JSON (0) | 2023.02.14 |
fetch API (0) | 2023.01.19 |
Node:fs 모듈 진행하면서 새로 배운 개념 (0) | 2023.01.18 |
동기 / 비동기 (0) | 2023.01.17 |