프로그래머스 문제 하나가 재귀함수를 필요로 했다. 아래 문제이다. 소수 만들기이다.
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장 캡쳐해서 보여주셨고, 다른 한 분은 그 재귀함수의 로직흐름을 그림으로 정리해 주셨다.
나도 맨위 재귀함수의 그림을 그려보았다. 아주 복잡하다. 결과적으로는 이 함수를 이해했다고 해야 될 것 같다.
하지만 모든 재귀함수를 이렇게 복잡한 그림으로 그려서 이해할 수는 없을 것이다. 아마 디버깅으로 찍어서 이해하는 게 맞을 거 같다.
'알고리즘 코딩' 카테고리의 다른 글
배열에서 요소 3개를 더했을 때, 소수가 되는 경우의 개수 (0) | 2023.04.22 |
---|---|
배열에서 문자열 요소들을 오름차순 정렬하면 대문자부터 나온다. (0) | 2023.04.21 |
같은 숫자는 싫어 ! 알고리즘 (0) | 2023.04.18 |
최소직사각형 알고리즘 feat. apply() 메서드 (0) | 2023.04.18 |
자연수가 하샤드 수인지 판별하는 알고리즘 (0) | 2023.04.18 |