[TIL]재귀함수를 이용한 숫자 프린트

테크야끼·2021년 4월 8일
0

TIL

목록 보기
3/11
post-thumbnail

재귀함수란?

재귀함수(Recursive function)란 함수내부에서 자신을 다시 호출하는 구조로 만들어진 함수이다. 재귀함수는 종료조건이 있어야 하며, 종료조건을 설정해주지 않으면 무한 반복을 하게된다.

자신을 반복해서 호출하는 재귀함수의 특성을 이용하여,매개변수에 숫자를 넣으면 특정 범위의 숫자를 프린트하는 함수를 만들어보자!


number print 1

먼저 만들어볼 함수의 조건은 총 세가지이다.

  1. 프린트되는 숫자의 범위는 매개변수와 매개변수의 사이의 숫자이다.
  2. 숫자뒤에 , 를 붙인다.
  3. 프린트된 총 숫자의 count도 프린트한다.

Javascript

//변수선언
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); 
  1. 함수를 호출한 후, 첫 실행이 되면 count 의 값은 0이기 때문에 참이 되며, i"i"로 반환되어 진다. 이 조건은 처음 숫자의 앞에 , 를 붙이기 않기 위해 쓰여졌다.

  2. 조건이 참이었으므로 if문 밖으로 나와 증감연산자 (increment operator)i++count++에 의해 값이 1씩 증가되며 (이 경우에 i 는 11, count는 1) 재귀함수를 통해 다시 자기자신을 호출하며 반복된다.

  3. 두번째 실행에서는 ielse로 가서 num += "." + i;에 의해 ,11으로 반환되며 2가 반복된다.

  4. 함수가 반복적으로 호출되다가 i의 값이 j의 값과 같아졌을 때 콘솔창에 숫자와 count가 출력된다.


number print 2

(변형) 같은 조건에서 짝수만 프린트해보자!

Javascript

//변수선언
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라는 조건을 추가하여 짝수만 프린트할 수 있다.

또한, countnumber print1 처럼 조건문 밖에 위치할 경우 i가 반복되는 수만큼 카운팅 되기 때문에 프린트되는 숫자와 그 count가 맞지 않게된다. 이를 해결하기 위해 count++를 짝수를 필터링하는 조건문에 함께 써주면 완성된다.

만약 count++if (count == 0) 조건문에 추가하지 않는다면, count는 계속 0인 상태에서, 첫번째 조건이 무한히 반복되어 Uncaught RangeError: Maximum call stack size exceeded 에러가 발생하니 주의하자! 🧨🧨🧨

0개의 댓글