재귀함수(Recursive function)란 함수내부에서 자신을 다시 호출하는 구조로 만들어진 함수이다. 재귀함수는 종료조건이 있어야 하며, 종료조건을 설정해주지 않으면 무한 반복을 하게된다.
먼저 만들어볼 함수의 조건은 총 세가지이다.
//변수선언
let num = "";
let count = 0;
//함수생성
function repeat(i, j) {
//1. 첫 실행
if (count == 0) {
num += i; //문자열 반환
//2. i가 j보다 큰 경우에 false 값 반환
} else if (i > j) {
return 0;
//3.초기값이 아니면 i 앞에 ,를 추가
} else {
num += "," + i;
//4.i값이 j값과 같으면 콘솔창에 숫자 출력
if (i === j) {
console.log(num); //10,11,12,13,14,15,16,17,18,19,20
console.log("count: " + count); //count: 10
}
}
i++;
count++;
repeat(i, j);
}
//함수호출
repeat(10, 20);
함수를 호출한 후, 첫 실행이 되면 count
의 값은 0이기 때문에 참이 되며, i
는 "i"
로 반환되어 진다. 이 조건은 처음 숫자의 앞에 , 를 붙이기 않기 위해 쓰여졌다.
조건이 참이었으므로 if문
밖으로 나와 증감연산자 (increment operator)i++
와 count++
에 의해 값이 1씩 증가되며 (이 경우에 i 는 11, count는 1) 재귀함수를 통해 다시 자기자신을 호출하며 반복된다.
두번째 실행에서는 i
는 else
로 가서 num += "." + i;
에 의해 ,11
으로 반환되며 2가 반복된다.
함수가 반복적으로 호출되다가 i
의 값이 j
의 값과 같아졌을 때 콘솔창에 숫자와 count가 출력된다.
//변수선언
let num = "";
let count = 0;
//함수생성
function repeat(i, j) {
if (count == 0) {
if (i % 2 === 0) { //짝수만 출력
num += i;
count++; //count
}
} else if (i > j) {
return 0;
} else {
if (i % 2 === 0) { //짝수만 출력
num += "," + i; //count
count++;
}
if (i === j) {
console.log(num); //10,12,14,16,18,20
console.log("count: " + count); //count: 6
}
}
i++;
repeat(i, j);
}
repeat(10, 20);
여기서 증감하며 반복되는 것은 i
이기 때문에 i
가 출력되는 조건에서 i % 2 === 0
라는 조건을 추가하여 짝수만 프린트할 수 있다.
또한, count
가 number print1 처럼 조건문 밖에 위치할 경우 i
가 반복되는 수만큼 카운팅 되기 때문에 프린트되는 숫자와 그 count가 맞지 않게된다. 이를 해결하기 위해 count++
를 짝수를 필터링하는 조건문에 함께 써주면 완성된다.
만약
count++
를if (count == 0)
조건문에 추가하지 않는다면,count
는 계속0
인 상태에서, 첫번째 조건이 무한히 반복되어 Uncaught RangeError: Maximum call stack size exceeded 에러가 발생하니 주의하자! 🧨🧨🧨