재귀란 자기 자신을 호출하는 절차 즉, 자기 자신을 호출하는 함수 재귀함수
JSON.parse
, JSON.stringify
document.getElementById
와 같은 DOM 순회 알고리즘 역시 재귀 함수로 작성됨function countDown(num){
if(num <= 0){
console.log("All done!");
return;
}
console.log(num);
num--;
countDown(num);
}
num === 3
일 때print 3
→ countDown(2)
→ print 2
→ countDown(1)
→ print 1
→ countDown(0)
→ print "All done!"
→ return
function sumRange(num){
if(num === 1)
return 1;
return num + sumRange(num - 1);
}
if(num === 1) return 1;
num === 3
일 때return 3 + sumRange(2)
sumRange(2)
➡︎ return 2 + sumRange(1)
sumRange(1)
➡︎ return 1
return 3 + (2 + 1) ⟹ 10
return
키워드를 만나게 되면 컴파일러가 스택의 가장 위에 있는 항목을 제거함 function factorialIterate(num){
let total = 1;
for(let i = num; i > 1; i--){
total *= i;
}
return total;
}
function factorialRecursive(num){
if(num === 1) // 중단 조건
return 1;
return num * factorialRecursive(num - 1); // 다른 입력 값
}
return
문이 없거나 잘못된 값을 return
하는 경우 function outer(input){
var outerScopedVariable = [];
function helper(helperInput){
helper(helperInput--);
}
helper(input);
return outerScopedVariable;
}
helper()
함수가 정의되어 있고 helper()
함수는 재귀적으로 자기자신을 호출함리스트를 변형하지 않고 새롭게 만든 데이터를 담아 합치는 방식으로 재귀를 구현
slice
, spread연산자(...)
, concat
같은 메소드를 사용slice
, substr
, substring
을 통해 string의 복사본을 만듦Object.assign
, spread 연산자
를 사용해 복사본을 만듦예시
function collectOddValues(arr){
let newArr = [];
if(arr.length === 0) {
return newArr;
}
if(arr[0] % 2 !== 0){
newArr.push(arr[0]);
}
newArr = newArr.concat(collectOddValues(arr.slice(1)));
return newArr;
}
collectOddValues([1,2,3,4,5]);
newArr
을 선언newArr
에 홀수인 값을 더해나가면서 최종적으로 입력 배열 중 홀수인 값만 갖고 있는 newArr
를 리턴