티스토리 뷰
코딩테스트/알고리즘 & 자료구조 개념
[알고리즘 | JS] Helper method recursion(헬퍼 함수 or 헬퍼 메소드 재귀)
blueprint-12 2023. 2. 17. 20:361. helper mehtod recursion
: 재귀적이지 않은 외부 함수가 재귀적인 내부 함수(inner function)을 호출하는 패턴이다.
- 헬퍼 함수 혹은 헬퍼 메소드 재귀라고 부른다.
- 메인 외부 함수를 개발자가 외부에서 호출한다.
- 이 외부 함수를 호출할 때 인자를 내부로 전달해 줄 수 있다.
- 그리고 이 외부 함수 내부에는 또 다른 내부 함수가 정의되어 있다. 내부함수는 호출되고 재귀적으로 자기자신을 호출한다.
- 문제 해결을 위한 하나의 접근법이다.
기본 예시
function outer(input) {
// 배열이나 데이터 목록 같은 걸 컴파일해야 할 때 사용
// ? 예시로, 어느 배열에서 모든 홀수 값을 수집하는 것과 같은 작업
let outerScopedaVariable = [];
function helper(helperInput) {
helper(helperInput--);
}
helper(input);
return outerScopedaVariable;
}
홀수만 뽑아내는 헬퍼 메소드 재귀 예시
function collectOddValues(arr) {
// 일종의 결과를 컴파일할 때 흔히 사용되는 패턴
// 배열이나 데이터 목록 같은 것(혹은 배열과 비슷한 다른 형태의 데이터 구조)
// ? 예시로, 어느 배열에서 모든 홀수 값을 수집하는 것과 같은 작업
let result = [];
function helper(helperInput) {
// 아래 if절은 종료조건 즉, 중단점
if (helperInput.length === 0) {
return;
}
if (helperInput[0] % 2 !== 0) {
result.push(helperInput[0]);
}
// slice(1)으로 이미 체킹이 끝난 0번째 요소를 제외 시키고 나머지 배열을 재귀적으로 호출!
helper(helperInput.slice(1));
}
helper(arr);
return result;
}
console.log(collectOddValues([1, 2, 3, 4, 5]));
// * 출력값: [1,2,3]
2. 홀수 배열만 뽑아내는 다른 접근방법: pure recursion
- 외부 함수를 쓰는 helper method recursion보다는 더 까다롭긴 하다.
- 코드는 더 짧지만 이해하는게 더 어려울 수 있다.
function collectObbValuesPureRecursion(arr) {
let newArr = [];
if (arr.length === 0) {
return newArr;
}
if (arr[0] & (2 !== 0)) {
newArr.push(arr[0]);
}
newArr = newArr.concat(collectObbValuesPureRecursion(arr.slice(1)));
return newArr;
}
해설 코드
- 5를 빈 배열과 합치면 그냥 5 => 그 다음 return newArr
- pure recursion 보다는 help recursion이 더 직관적이다. 하지만, pure recursion의 코드가 더 짧다.
2-1. pure recursion 사용 tips
- 배열을 사용하고 헬퍼 메소드없이 순수 재귀 솔루션을 작성하는 경우, 배열을 복사하는 slice, spread 연산자(e.g....Arr), concat 같은 메소드를 사용할 수 있다. 이러면 배열을 변경할 필요가 없다.
- 주의) 문자열을 변경할 수 없음 -> slice나 substring을 사용해 사본(copy)을 만들어야 한다.
- 객체의 경우, Object.assign 이나 spread 연산자를 사용하는 게 유용하다.
Array.prototype.concat()
concat() 메서드는 인자로 주어진 배열이나 값들을 기존 배열에 합쳐서 새 배열을 반환
기존 배열을 변경하지 않으며 추가된 새로운 배열을 반환한다.
concat 예시
const array1 = ['a', 'b', 'c'];
const array2 = ['d', 'e', 'f'];
const array3 = array1.concat(array2);
console.log(array3);
// Expected output: Array ["a", "b", "c", "d", "e", "f"]
Array.prototype.slice()
slice() 메서드는 어떤 배열의 begin 부터 end까지(end 미포함)에 대한 얕은 복사본을 새로운 배열 객체로 반환
원본 배열은 바뀌지 않고 새로운 배열을 반환한다.
slice 예시
const animals = ['ant', 'bison', 'camel', 'duck', 'elephant'];
console.log(animals.slice(2));
// Expected output: Array ["camel", "duck", "elephant"]
console.log(animals.slice(2, 4));
// Expected output: Array ["camel", "duck"]
'코딩테스트 > 알고리즘 & 자료구조 개념' 카테고리의 다른 글
[알고리즘 | JS] sorting algorithm(정렬 알고리즘) - bubble sort (0) | 2023.02.20 |
---|---|
[알고리즘 | JS] 검색과 검색 알고리즘(search algorithm) (0) | 2023.02.19 |
[알고리즘 | JS] 재귀함수에 대해 알아보자! (호출스택, 스택오버플로우) (0) | 2022.04.23 |
[알고리즘 | JS] 분할과 정복 패턴( Divide and Conquer) (0) | 2022.04.23 |
[알고리즘 | JS] Sliding Window Pattern(기준점 간 이동 배열 패턴) (0) | 2022.04.19 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 프리온보딩 프론트엔드 챌린지 3월
- 프리렌더링확인법
- ~ ^
- 원티드 프리온보딩 FE 챌린지
- reactAPI
- getStaticPaths
- nvm 설치순서
- fs모듈 넥스트
- 항해99프론트
- tilde caret
- 원티드 3월 프론트엔드 챌린지
- grid flex
- 부트캠프항해
- is()
- 틸드와 캐럿
- && 셸 명령어
- nvm경로 오류
- float 레이아웃
- getServerSideProps
- 원티드 FE 프리온보딩 챌린지
- D 플래그
- 형제 요소 선택자
- 타입스크립트 DT
- aspect-ratio
- 타입스크립트 장점
- Prittier
- 항해99추천비추천
- text input pattern
- 원티드 프리온보딩 프론트엔드 챌린지 3일차
- 항해99프론트후기
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함