JavaScript 재귀함수

otter·2021년 7월 20일

Java Script

목록 보기
12/13

Recursive function


하나의 문제를 조금 더 작은 단위로 나눠 해결하려 해보고,

더 작은 단위도 가능하다면 또 나눠보고,

작아질 수 있는 가장 작은 단위의 문제가 생성되면,

가장 작은 문제 단위부터 차례로 다시 올라오며 해결하는 것을
재귀라고 한다.


재귀함수 문제를 풀던 중 내 머리로는 아직 재귀적인 사고가 잘 되지 않는다는 것을 느꼈다..

아래와 비슷한 상황에서 이해가 어려웠다.

function test(arr) {
  const tail = arr.slice(1);
  if(arr.length !== 0) {
    return 1 + test(tail);
  } else {
    return 0;
  }
}

위 코드는 배열 arr의 길이를 반환하는 문제에 대한 풀이다.

아주 기초적인 구조처럼 보인다.

하지만 나는 문제를 풀었음에도 완벽히 이해하질 못해서 debugger도 사용해보고,

직접 캡쳐를 해 작동 과정을 그려보기도 하며 이해를 했다.

내가 이해하지 못했던 부분은,

어째서 if문 안의 return 값으로 1+를 적어줬을 뿐인데 결과값이 나오는가였다.

재귀함수는 위 사진처럼 함수 안에 또 다른 함수(자기 자신)을 호출하는 형태다.


위 코드의 경우 arr에 [1, 2, 3, 4]라는 배열이 들어왔다면,

우선 tail에 0번 인덱스의 요소 1을 제외한 배열이 담긴다.

if문 arr.length !== 0에 걸려 return 1 + test(tail)이 실행된다.

그 후 위 사진처럼 반복적으로 return 1 + test(tail)이 실행된다.

그러다가 base condition인 arr.length === 0의 조건이 충족되면,

그에 따라 else {return 0}이 실행된다.

그럼 다시 위로 올라가며 실행됐던 return 1 + test(tail)에 return 값을 반환한다.

우선 return 0을 통해 0이 가장 먼저 반환되고,

그 후 1씩 더해지며 결국 '4'라는 숫자가 리턴되게 된다.

0개의 댓글