SEB_FE_45(코드스테이츠)/section 3.

Unit 1] [자료구조/알고리즘] 재귀 part.1

YTReeee 2023. 6. 10. 09:33

SEB _ FE _ 45

Section 3. Unit 1. [자료구조/알고리즘] 재귀

 

코드스테이츠 부트캠프 참여한지 벌써 2달이 지났다?

시간이 참 빠른 것 같다.

section2는 정신없이 유닛이 진행되어 "어어~!? " 하는 사이에 끝나버린 것 같아.. 제대로 된 이해를 위해 복습하면서 블로깅을 하도록 해야겠다.

Section3 는 그날 배운 내용을 바로 복습 블로깅을 목표로 해보도록 하겠다!(이미 하루 늦음..)


section3 첫 유닛은 재귀다!

재귀(recursion)란 사전적의미로 원래의 자리로 되돌아가거나 되돌아옴을 의미하는 단어이다.

돌아간다아~~~~~ 출처 : 코드스테이츠 유어클래스


재귀를 잘 사용하려면 재귀적 사고가 필요하다.

  1. 재귀 함수의 입력 값 출력 값 정의하기
    • 가장 추상적으로 또는 가장 단순하게 정의하기
    • ex ) A 함수 : 입력값 (Array(숫자를 요소로가진)) => 출력값 (Number)
  2. 문제를 쪼개고, 경우의 수를 나누기
    • 문제를 쪼갤 기준 정하기 : 순서나 크기에 관계 없이 같은 방식으로 풀 수 있게 구분된 문제 만들기
    • ex ) [1,2,3] 배열의 합을 구하는 함수를 재귀적으로 표현하면 => 1 + [2, 3] => 1 + 2 + [3] => 1 + 2 + 3 + [ ]
    • 문제를 더이상 쪼갤 수 없는 경우(위 예시에서는 [ ](빈배열) 일 때)와 그렇지 않은 경우([1, 2, 3] 일 때)로 나누기
  3. 단순한 문제 해결하기 = 가장 쉬운 문제 해결하기 = base case
    • 재귀의 기초(base case) === 재귀 함수의 탈출조건
    • 문제를 최대한 잘게 쪼갠 후 문제 해결
  4. 복잡한 문제 해결하기 = recursive case 해결하기
    • base case 가 해결되면 순차적으로 해결됨

재귀 함수의 코드 템플릿

function recursive(input1, input2, ...) {
  // base case : 문제를 더 이상 쪼갤 수 없는 경우
  if (문제를 더 이상 쪼갤 수 없을 경우) {
    return 단순한 문제의 해답;
  }

  // recursive case : 그렇지 않은 경우
  return 더 작은 문제로 새롭게 정의된 문제
}

정리 및 회고

재귀라는 말 자체가 어렵고, 개념도 설명하기 어려운데, 생각만큼 현업에서 많이 쓰이지는 않나 보다.

질의응답 세션 강사님이 말씀하시길, 현업에서 재귀는 잘 사용하지 않는다고 한다.

 

그 이유는 아래와 같이 답변해주었다.

혼자 하는 소규모 프로젝트가 아니고, 대규모 프로젝트를 팀 동료들과 코드를 공유해햐 하는데, 재귀함수를 사용한다?
재귀함수가 어떻게 작동하는지 꼬리물기로 타고 들어가야 하기 때문에 가독성이 떨어질 수 밖에 없다.
어차피 반복해야 하는 작업이라면 for루프가 가독성이 좋을수도 있다.

 

재귀에 대해 공부해보니, 사실 상 핵심은 ! 문제를 잘게 쪼갠다 ! 라고 생각한다.

위에서 언급한 것처럼 같은 방식으로 풀수 있는 문제로 구성해야 한다. 탈출 조건을 만들어야 한다 등 추가적인 내용이 필요하지만, 일단 잘 쪼개놓는게 가장 중요해보인다.

새로 시작하는 섹션 3! 부트캠프 3개월 차!

지금까지 배워온 것 중 부족한 부분을 점검해보고, 어떻게 보완할지 새롭게 공부 계획을 세워보자!

 

좌절은 짧게 하고, 까먹어버리자!
좌절에 소모해야 하는 메모리 비용이 너무 비싸다!