Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- Mini Node Server
- 노마드코더
- .current
- useRef역할
- 실행컨텍스트란
- styled-component
- state hook
- npm 에러
- 로컬상태
- 객체
- 개발공부
- CORS
- Block
- 실행컨텍스트 동작과정
- 실행컨텍스트 실행과정
- 영어공부
- 고차함수
- 알고리즘
- html
- 실행컨텍스트콜스택
- 그래머인유즈
- CLI
- 전역상태
- 실행컨텍스트스택
- 영어
- .env
- css
- 개발일기
- 실행컨텍스트자바스크립트
- 실행컨텍스트 면접
Archives
- Today
- Total
오늘도 삽질중
[자료구조/알고리즘] 재귀 본문
👊 재귀(Recursion)
정의: 자신을 정의할 때 자기 자신을 재참조하는 방법
(어떤 함수가 스스로를 호출하는것)
자연수로 이루어진 배열의 합을 구하는 arrSum (재귀적으로 생각해서 구하기)
arrSum([1, 2, 3, 4]) = 1 + arrSum([2, 3, 4]);
arrSum([2, 3, 4]) = 2 + arrSum([3, 4]);
arrSum([3, 4]) = 3 + arrSum([4]);
arrSum([4]) = 4 + arrSum([]);
arrSum([]) = 0;
쪼개서 생각하고 또 쪼개서 생각하는걸 볼 수 있음
🎟 모든 재귀 함수는 반복문으로 표현할 수 있다. 그러나 재귀를 적용하는 경우가 더욱 간결하고 이해하기 쉽다.
🎟 재귀는 반복할 구문을 함수 단위로 분리해, 특정 조건이 만족할 때까지 실행하는 패턴으로 볼 수 있다. (Recursive Case)
🎟 재귀는 무한 반복을 방지하기 위해 반드시 탈출 조건이 있어야한다.
// 4! 구하기
function fac(n) {
// Base Case
// n이 0이면 재귀를 더 이상 진행하지 않는다.
if(n === 1) {
return 1
}
// Recursive Case
return n * fac(n-1);
}
👊 재귀를 사용하기에 적합한 경우
1. 주어진 문제를 비슷한 구조의 더 작은 문제로 나눌 수 있는 경우
2. 중첩된 반복문이 많거나 반복문의 중첩 횟수(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);
}
}
}
}
}
}
}
}
👊 재귀의 장점과 단점
장점 : 알고리즘이 재귀로 표현하기에 자연스러울 경우, 프로그램의 가독성이 좋다.
단점 : 값이 리턴되기 전까지 호출마다 call stack을 새로 생성하므로, 메모리를 많이 사용한다.
Comments