재귀 익숙해지기
재귀함수를 짜면서 느끼는건
어렵다는 느낌도 있지만
결국엔 익숙하지 않기 때문에 어렵다고 생각되는 것 같다는 것이다.
재귀라는 낯선 흐름을 억지로 생각하려고 하기때문에 머리가 아프다는 느낌이었다.
결국 재귀라는 것에 익숙해지는 것이 재귀를 쉽게 다룰 수 있는 방법이 될 것이라 생각한다.
재귀함수 - unpackGiftbox
문제 : 선물 상자에 대한 정보를 담은 배열과 문자열을 입력받아 조건에 맞는 선물이 있는지 여부를 리턴해야 한다.
입출력 예시 : const giftBox = ['macbook', 'mugcup', ['eyephone', 'postcard'], 'money'];
let output = unpackGiftbox(giftBox, 'iphone');
console.log(output); // --> false
output = unpackGiftbox(giftBox, 'postcard');
console.log(output); // --> true
풀이
function unpackGiftbox(giftBox, wish) {
//for loope로 giftBox배열의 요소들을 순회
for (let i = 0; i < giftBox.length; i++){
if(giftBox[i]===wish){
return true;
//요소가 배열인 경우 재귀로 배열이 아닌 경우때까지 쪼개서 요소를 확인한다.
}else if(Array.isArray(giftBox[i])){
let recursion = unpackGiftbox(giftBox[i],wish)
//쪼개서 확인한결과 재귀의 return 값이 true가 뜨면 true를 리턴한다
if(recursion){
return true;
}
}
}
//return값이 없으면 wish와 일치하는 요소가 없는 것이므로 false를 리턴한다.
return false;
}
Today's ?!
재귀함수를 작성하는 과정.
먼저 base case(더이상 쪼갤 수 없는, 재귀의 탈출조건), head, tail을 생각한다.
이들을 기준으로, 입력값의 크기와 순서를 생각하면서 재귀함수를 작성한다.
로직이 생각나지 않는다면,
양극단과 중간값을 생각해보면서 로직을 구상한 뒤, 재귀함수를 작성한다.
예를들어 입력값이 배열이면
양극단값은[]
[1,[2,3],[[[],[2]],[123]]
이 두개로 나눌 수 있고
중간 값은[1,2,3,4,5]
이렇게 생각할 수 있다.
이후 어떻게하면 반복되는 방법으로 결과를 도출해낼 수 있을지 생각하며 로직을 짠다.
'개인공부 > TIL(Today I Learned)' 카테고리의 다른 글
TIL 26일차_DOM이해하기 (0) | 2021.02.13 |
---|---|
TIL 25일차_DOM연습하기 (0) | 2021.02.12 |
TIL 23일차_정렬, 재귀 (0) | 2021.02.10 |
TIL 22일차_reduce() (0) | 2021.02.09 |
TIL 21일차_Twittler과제 (0) | 2021.02.08 |