본문 바로가기

알고리즘 코딩

재귀함수. 집요한 정리

 

프로그래머스 문제 하나가 재귀함수를 필요로 했다. 아래 문제이다. 소수 만들기이다.

https://school.programmers.co.kr/learn/courses/30/lessons/12977

 

그래서 재귀함수를 들여다보았는데 문제를 풀기 위해 내가 들여다 본 재귀함수는 아래와 같다.

const getCombinations = (arr, num) => {
  const results = [];


  if (num === 1) return arr.map(v => [v]);

  arr.forEach((fixed, index, origin) => {

    const rest = origin.slice(index + 1);

    const combinations = getCombinations(rest, num - 1);

    const attached = combinations.map(v => [fixed, ...v]);
    results.push(...attached);

  });
  return results;
}

const arr = [1, 2, 3, 4];
console.log(getCombinations(arr, 3))

 

이해가 안 되었다. 그냥 넘어갈 수 없었다. 아주 쉬운 재귀함수부터 항해99 slack 질문방에 올려 이해했다. 크루분들이 무려 2분이나 도와주셨다. 눈에 안띄는 글이지만 다시 한번 감사를 표해 본다. 한 분은 vscode디버깅을 5장 캡쳐해서 보여주셨고, 다른 한 분은 그 재귀함수의 로직흐름을 그림으로 정리해 주셨다. 

 

나도 맨위 재귀함수의 그림을 그려보았다. 아주 복잡하다.  결과적으로는 이 함수를 이해했다고 해야 될 것 같다. 

하지만 모든 재귀함수를 이렇게 복잡한 그림으로 그려서 이해할 수는 없을 것이다. 아마 디버깅으로 찍어서 이해하는 게 맞을 거 같다.