JS) 재귀함수

백준우·2021년 10월 6일
1

JavaScript & TypeScript

목록 보기
8/15
post-thumbnail

재귀함수

1. 재귀함수

1.1 재귀함수 특징
1.2 재귀함수 사용 예시


1. 재귀함수

재귀란? [어떤함수가 스스로를 호출하는것]

  • 자료구조에서 Tree구조에서 재귀함수를 사용한다.
  • for문과 while문으로도 충분히 할 수 있지만 재귀함수로 풀어야하는 알고리즘은 존재한다.

1.1 재귀함수 특징

특징
1. 종료조건: 종료조건을 통해 원치 않는 값이 들어왔을경우 재귀가 계속 동작하는것을 방지해줍니다.
2. 기반조건(Base case): 재귀함수의 목적으로 if문 내부에 있습니다. 기반조건까지 도달하도록 재귀함수를 구성해보자
3. 재귀: 함수를 재귀하여 기반조건에 도달할때까지 재귀를 실시 해줍니다.

  • 재귀함수는 언제 사용하는게 좋을까?
  1. 주어진문제를 비슷한구조의 더 작은문제로 나눌수 있을때
  2. 중첩횟수의 예측이 어려운경우(다중배열)
arr = [1,2,3,4,5,6]

위 배열의 항목들을 하나씩 더하는 함수를 만들어보겠다.
물론 처음 보는 순간 for문을 먼저 생각할것이다.

function Sumarr(arr) {
  let sum = 0;
  for (let i = 0; i < arr.length; i++) {
    sum += arr[i];
  }
  return sum;
}

위 함수로 충분히 가능하다. 하지만 이 문제를 다른각도로 바라보자

1 + Sumarr([2,3,4,5]) // 1과 나머지 배열
3 + Sumarr([3,4,5]) // 1+2와 나머지 배열
6 + Sumarr([4,5]) //1+2+3과 나머지 배열
10 + Sumarr([5]) //1+2+3+4과 나머지 배열
15 + Sumarr([]) //1+2+3+4+5과 나머지 배열

위 예시를 코드로 구현하면 아래와같다

function arrSum(arr) {
  if(arr.length === 0){return 0}
  // 예외로 빈배열이면 0을 출력한다.
  if(arr.length === 1){
    return arr[0]
  //재귀탈출문으로 배열 길이가 1이면 남은 1배열을 출력한다.
  }
  return arr[0] + arrSum(arr.slice(1))
 //재귀문으로 현재 입력된배열의 첫번째 행과 arrSum에 arr의 1번째 인덱스부터 기입하여 함수를 재귀한다.
}

그림으로 비유하면 위와같다.
끝에 재귀 탈출함수에서 return하는 값에서 역으로 나왔던 수를 더했다.
물론 더 어려운 개념이지만 간단한 문제인만큼 재귀의 역할만 간단히 알아보도록 하자

1.2 재귀함수 사용예시

재귀함수 템플릿

function func(value) {
  if (문제를 더 이상 쪼갤 수 없을 경우) {
    return 단순한 문제의 해답;
  }
  // 그렇지 않은 경우
  return 더 작은 문제로 새롭게 정의된 문제
}

1.2.1

1부터 덧셈하는 함수

function Sumnum(num) {
  if(num === 0){
    return num 
 }
  return num + sumTo(num-1)
}
Ex) Sumnum(4)
return ... 

4 + Sumnum(3)
return 3 + Sumnum(2)
return     2 + Sumnum(1)
return         1 + Snumnum(0)
                    return 0

4 + 3 + 2 + 1 + 0 = 10

1.2.2

배열 순서 뒤집기

function rrA(arr) {
  if(arr.length===0){
    return []
  }
  head = arr.pop()
  tail = arr.slice(0,arr.length)

return [head].concat(rrA(tail))
}
  1. arr.length가 0이되면 빈배열을 리턴한다.

  2. head에 입력된 배열의 끝 값이 들어간다.

  3. tail에 arr의 0번째 인덱스부터 길이만큼 기입합니다.

  4. return에 맨 앞에 두었던 head를 앞에 두고 concat사용해 뒤에 tail을 기입하여 현재 함수를 재귀한다.

  5. 입력되는 배열의 길이가 0이될시 재귀탈출문을 통해 빈배열을 concat하여 최종적으로 뒤집힌 배열을 출력한다.

profile
이게 되네?

0개의 댓글