사소한 삽질(재귀함수)

최재홍·2023년 4월 12일
0

알고리즘 문제를 풀다가 제곱근을 구하는 문제를 만나게 되었다. 특정 숫자 n을 매개변수로 받아서 함수를 실행시키면 그 수를 나누는 수 i를 점차 증가시켜나가면서 나눠떨어질 때마다 객체에 key와 value로 저장을 하는 식으로 진행을 하고 싶었다.

예시로 들면 다음과 같다.

<script>
function solution(n) {
  var answer = 1;
  let newNumber;
  let obj = {};
  function divide(n) {
      if(n === 1) {
          return obj;
      }
      for(let i = 2; i <= n; i++) {
          if(n % i === 0) {
              obj[i] = (obj[i]|0) + 1;
              newNumber = n / i;
              divide(newNumber);
          }else{
              continue;
          }
    }
  }
  divide(n);
  .
  .
  .
  .
</script>

요컨대 더이상 나눠떨어지는 수가 없을 때까지 재귀함수를 실행시키는 함수이다. 그런데 결과로 완성되는 obj의 형태가 조금 이상했다. 가령 n이 121이라면 obj의 형태는 {11 : 2}로 마무리 지어져야 한다. 하지만 {11 : 2, 121 : 1}이 계속 되는 것을 보고 의아하게 생각했다.

고민한 결과, 반복문이 멈추지 않았다는 것을 알게 되었다. 나의 생각으로는 반복문이 실행되는 과정에서 재귀함수를 실행시키면 반복문은 거기까지만 실행되고, 남은 반복문은 무시되고 재귀함수가 실행되는줄 알았지만 그게 아니라 재귀함수가 실행되고, 남은 반복일정이 실행되는 것이었다.

그래서 재귀함수 다음 부분에 break가 필요하다는 것을 알았다. 반복문 속에서 재귀함수를 실행했을 때, 반복문은 중지되는 것이 아니라 유보가 된다는 사실을 알았다. 꼭 기억해두자.

또한 재귀함수를 같은 매개변수로 실행시키다가 오류를 맞닥뜨리기도 했다. 함수를 통해 조작된 매개변수로 다음 재귀함수를 실행시켜야 하는 경우에는 함수 외부에 새로운 변수를 만들어서, 조작된 매개변수를 할당하고, 그 조작된 매개변수를 매개변수로 하여 재귀함수를 실행시키도록 유의하자.

0개의 댓글