[개발자되기: 재귀] Day-33

Kyoorim LEE·2022년 6월 23일
0

재귀

재귀를 코드로 표현한다면..?

function recursion () {
  console.log("This is")
  console.log("recursion!")
  recursion()
}

재귀로 문제 해결하기

  1. 문제를 더 작게 쪼개기
  2. 1번을 계속하여 문제가 더 작아지지 않을 때까지 가장 작은 단위로 쪼개기
  3. 가장 작은 단위의 문제를 풂으로써 전체 문제를 해결

코드스테이츠 예시

문제: 자연수로 이루어진 리스트(배열)를 입력받고, 리스트의 합을 리턴하는 함수 arrSum 을 작성하세요.

//arrSum([]) === 0; // <-- 문제가 더는 작아지지 않는 순간
// 가장 작은 경우의 해결책을 적용합니다.
//arrSum([5]) === 5 + arrSum([]) === 5 + 0 === 5;
//arrSum([4, 5]) === 4 + arrSum([5]) === 4 + 5 === 9;
//arrSum([3, 4, 5]) === 3 + arrSum([4, 5]) === 3 + 9 === 12;
//arrSum([2, 3, 4, 5]) === 2 + arrSum([3, 4, 5]) === 2 + 12 === 14;
//arrSum([1, 2, 3, 4, 5]) === 1 + arrSum([2, 3, 4, 5]) === 1 + 14 === 15;
// arrSum함수는 다음과 같이 만들 수 있다
function arrSum (arr) {
  // 빈 배열을 받았을 때 0을 리턴하는 조건문
  //   --> 가장 작은 문제를 해결하는 코드 & 재귀를 멈추는 코드
  if (arr.length === 0) {
    return 0
  }
  // 배열의 첫 요소 + 나머지 요소가 담긴 배열을 받는 arrSum 함수
  //   --> 재귀(자기 자신을 호출)를 통해 문제를 작게 쪼개나가는 코드
	return arr.shift() + arrSum(arr)
}

재귀는 언제 사용하는게 좋을까?

  1. 주어진 문제를 비슷한 구조의 더 작은 문제로 나눌 수 있을 때
  2. 중첩된 반복문이 많거나 반복문의 중첩횟수를 예측하기 어려울 때

일반적인 재귀함수 template

function recursive(input1, input2, ...) {
  // base case : 문제를 더 이상 쪼갤 수 없는 경우
  if (문제를 더 이상 쪼갤 수 없을 경우) {
    return 단순한 문제의 해답;
  }
  // recursive case : 그렇지 않은 경우
  return 더 작은 문제로 새롭게 정의된 문제
}
profile
oneThing

0개의 댓글