재귀함수는 함수 내부에서 자신을 호출하고, 그 함수 내부에서 또 자신을 호출하는 아래의 그림과 같은 구조를 가진다.
👉 재귀함수
는 자기 자신을 호출하는 함수를 뜻하며, 기본적으로 아래와 같은 구조를 가진다.
function recursion () { console.log("recursion 함수가 실행되었습니다.") recursion() // 자기 자신을 호출한다. } ``
recursion 함수가 실행되었습니다. recursion 함수가 실행되었습니다. recursion 함수가 실행되었습니다. ...
하지만 위와 같은 구조로 작성할 경우 무한으로 자기 자신을 호출하여, stackoverflow를 발생시킨다. 따라서 if문과 같은 조건을 걸어서 빠져나올 구간을 만들어 주어야 한다.
function recursion (num) { console.log(num + "번 recursion 함수가 실행되었습니다.") // num이 3이 되면 종료한다. if(num === 3) { return; } recursion(num + 1) // 자기 자신을 호출한다. }
1번 recursion 함수가 실행되었습니다. 2번 recursion 함수가 실행되었습니다. 3번 recursion 함수가 실행되었습니다.
👉 재귀함수
에서 자기 자신을 호출하는 것은 recursive case
이다.
👉 재귀함수
에서 탈출 조건에 걸려 return 되는것은 base case
이다.
// giftBox 배열 안에 wish라는 요소가 // 존재한다면 true를 반환 // 존재하지 않는다면 false를 반환 function unpackGiftbox(giftBox, wish) { // giftBox의 각 요소를 순환 for(let i = 0; i < giftBox.length; i++){ // 만약 giftBox[i]의 요소가 wish와 같다면 true를 반환 if(giftBox[i] === wish){ return true; } // 만약 giftBox[i]의 요소가 배열이라면 if(Array.isArray(giftBox[i])){ // unpackGiftbox(giftBox[i], wish)함수를 func에 할당한다. const func = unpackGiftbox(giftBox[i], wish); // 만약에 unpackGiftbox(giftBox[i], wish)함수를 할당한 func가 참이라면 // true를 반환한다. if(func){ return true;} } } return false; }
입력
let arr = ['macbook', ['eyephone', [], ['postcard']], 'iphone'] unpackGiftbox(arr, 'iphone') // true를 반환
1. stackoverflow
2. 유지보수의 어려움
3. 왠만하면 반복문으로