TIL 18 | 재귀함수 (recursion)

dk.han·2021년 8월 25일
0
post-thumbnail

재귀가 뭐임?

재귀함수 recursion... 그냥 단어만 봐도 어렵다. 한숨 뿍뿍 나오내.
한 함수가 자기 자신을 호출하는 순간을 재귀라고 한다.
공부한걸 토대로 내 생각을 정리해 보면 'A라는 함수 내에서 A함수를 실행시켜 반복적인 작업을 하는 것'
이렇게 이해하고 있다.

재귀함수는 반복문 'for' 또는 'while'로 대체 될 수 있다. 이 반대도 마찬가지.
그렇다고 무작정 재귀함수를 쓰는 것은 옳지 않다고 한다.
반복문보다 속도가 느리기 때문에 , 재귀를 쓰는것이 더 나은 로직인지를 잘 판단해서 써야 한다.

여기서 들엇던 의문은

그럼 왜 어렵게 재귀함수를 쓰지? 반복문으로 해결하면 되잖아?

왜..지..?
알고리즘 문제를 풀어보고 sprint 과제들을 하면서 느낀점은

코드를 간결하게 만들어준다.

sprint에서 했던 JSON.stringify를 함수로 작성해보는 과제가 있었는데,
만약 재귀함수를 쓰지 않았다면 코드의 길이가 굉장히 길었을 것이다.
코드가 길어진다는 것은 코드가 복잡해지고, 선언해야 될 변수도 많아지게 되면서
개발자 입장에서 실수할 확률이 증가하는 것이기 때문에 좋지 않다고 생각한다.

또한 당연한 말이지만 코드가 간결해져 가독성이 증가한다.
재귀함수에 대한 이해가 높아 적재 적소에 사용 할 줄 안다면 가독성이 증가한다.

재귀를 사용할 때 가장 중요한 것 3가지.

우선 예시로 factorial을 들어보자. 가장 간단한 예.

function factorial(num) {
  
  if (num<0) return; // 종료 조건
  
  if (num===0) return 1; // base case (문제를 더이상 쪼갤수 없는 경우)
  
  return num * factorial(num-1); // recursive case (그렇지 않은 경우)
}

factorial(4) // 24
  • 종료 조건
    재귀의 안전장치라고 생각하면 된다. if (num<0) 조건처럼 음수가 들어온다면 팩토리얼을 구하는 것은 불가능 하기 때문에, 함수를 종료시키는 역할을 한다.

  • Base case
    문제를 더이상 쪼갤수 없는 경우 라고 표현 했지만, 다르게 말하면 함수의 종착지 라고 할 수 있다.
    Base case인 if (num===0) return 1 의 조건에 부합하여 1을 return하고 함수가 종료 되게 된다면 재귀함수가 반복적으로 실행 되면서 num이 1씩 감소하고 결국 0이 되어 목표를 달성하고 함수가 종료 되는 것 이기 때문이다.
    Base case가 종료조건과 비슷해 보이지만 종료조건은 원치않는 조건들이 들어왔을 때 함수를 종료시키는 것이기 때문에 Base case와는 다르다.

  • recursive case
    함수가 자기 자신을 호출하는 부분이다. return num * factorial(num-1); 재귀가 일어나는 곳이다. 어디서 재귀를 써야하는지 판단하는게 쉽지 않다. 어려운 부분중 하나.

느낀점.

알고리즘 문제 풀때를 제외하곤 직접 혼자서 재귀함수를 사용해 본 경험이 없어서 마냥 어렵기만하다.

Base case와 recursive case를 잘 나눠서 설정하는게 중요하다고 생각한다.

그러기 위해서는 재귀적 사고가 필요하다고들 하더라. 작은 단위로 쪼개서 생각하는...

for문에 적응했다 싶으니까 재귀같은 녀석이 등장해버리내... 그 어려웠던 for문도 시간이 지나면서 적응 했듯이 재귀함수도 시간이 해결해 주리라 생각한다.

재귀함수에 익숙해 질 때 즈음 한번 더 남기도록 하자.

0개의 댓글