function unpackGiftbox(giftBox, wish) {
for(let i = 0; i < giftBox.length; i++) {
if(giftBox의 요소가 wish랑 같다면) {
return true;
}
if(giftBox요소가 배열이라면) {
if(unpackGiftbox재귀) {
return true;
}
}
}
return false;
}
const giftBox = ['macbook', 'mugcup', ['eyephone', 'postcard'], 'money'];
let output = unpackGiftbox(giftBox, 'iphone');
console.log(output); // --> false
output = unpackGiftbox(giftBox, 'postcard');
console.log(output); // --> true
재귀의 흐름
만약 giftbox요소가 배열이라면
if(unpackGiftbox(giftBox[i], wish)) {
return true;
}
이부분을 풀어 쓰면
if(
for(let i = 0; i < giftBox.length; i++) {
if(giftBox[i] === wish) {
return true;
}
if(Array.isArray(giftBox[i])) {
if(unpackGiftbox(giftBox[i], wish)) {
return true;
}
}
}
return false;
) {true}
function unpackGiftbox(giftBox, wish) 함수를 다시 재생 하는 것
만약 또 giftbox의 요소중 배열이 있고,
그 배열안에 또 배열이라면 위의 if문에서 function unpackGiftbox(giftBox, wish) 가 실행 된다.
original function => recursive function => recursive function ... 배열이 없을때까지
중요한점
if(unpackGiftbox(giftBox[i], wish)) {
return true;
}
이부분에서 if문이 재귀 함수를 감싸고있다
즉, unpackGiftbox(giftBox[i], wish) 함수가 true라면 true값을 반환 하고 탈출 한다라는 뜻으로
재귀가 true일때 라는 것을 안써주면 false로 return하여 탈출 한다.
즉,
base case
if(unpackGiftbox(giftBox[i], wish)) {
return true;
}
요소가 배열이여서 재귀 함수 실행시
giftbox = [요소1, 요소2, [요소3, 요소4, 요소5], 요소6]
요소5가 giftbox에 있는지 있으면 true 반환
반복문으로 giftbox를 순회
0번째 요소
1번째 요소
2번째 배열 => 재귀함수로 들어가며 모든값 리셋
2번째 배열 = [요소3, 요소4, 요소5]
반복문으로 2번째 배열 순회
0번째 요소
1번째 요소
2번째 요소 = 요소5 // 있는거 확인
재귀 함수 안의 if문으로 true 반환
if(giftBox[i] === wish) {
return true;
}
=> true;
original 함수의 if문으로 재귀 함수가 ture라면 true 반환
if(unpackGiftbox(giftBox[i], wish)) {
return true;
}
if(true)) {
return true;
}
=> true;