요즘 들어 제대로 이해하고 있는게 있나 싶을 정도로
공부할때 마다 지난 개념 부분이 부족하거나 잘못되어 있는 것을 발견하게 된다.
재귀의 개념이 잘 안잡힌것 같은 느낌이 들었다.
다시 공부하면서 전보다는 더 가깝게 이해한 것 같았다.
다차원 배열을 1차원 배열로 재귀를 이용해서 만들어 보려고 한다.
물론 flat();
의 아주 좋은 메소드가 있지만 flat();
은 사용하지 않고
재귀를 연습한다고 생각하고 해봤다.
여러 방법이 있겠지만 헷갈렸던 선언한 빈 배열에 추가하는 방법을 연습해봤다.
재귀할때마다 함수 안에 선언된 빈 배열이 나와서 머리 속으로 잘 상상이 되지 않았었다.
let numberArr = [1,2,[3,4,[5,6,[7,[8,[9]]]]]];
function arrayFlat (arr) {
const pressed = [];
for (let i = 0; i < arr.length; i++) {
if (Array.isArray(arr[i])) { // 요소가 배열이라면
-> const press = arrayFlat(arr[i]); // 요소를 재귀한 결과를 변수에 담는다.
-> pressed.push(...press); // 변수에 담긴 배열을 배열에 푸쉬한다.
}
else {
pressed.push(arr[i]); // 배열이 아니라면 그 요소를 배열에 푸쉬한다.
}
}
return pressed;
}
arrayFlat(numberArr); // [1,2,3,4,5,6,7,8,9]
어려웠던 부분은 화살표 부분이다.
저 부분을 한번 써보면서 표현을 해보니 이런 표현이 되었다.
arr0 = [1,2,[3,4,[5,6,[7,[8,[9]]]]]]; // 배열을 받았다.
pressed0 = []; // 초기는 없는 상태에서
-> = [1,2]; // 배열이 아니면 푸쉬하다가 3부터 있는 배열 arr[2]를 만났다.
// 그럼 그 배열 arr[2]를 재귀함수의 인자로 넣어 호출하면
arr1 = [3,4,[5,6,[7,[8,[9]]]]]; // 3부터 시작하는 arr[2]가 arr1이 된다.
pressed1 = []; // 이 함수의 pressed는 아직 없는 상태다.
-> = [3,4]; // 3부터 푸쉬하다가 5부터 시작하는 배열 arr[2]를 만난다.
// 재귀함수의 인자로 호출하면
arr2 = [5,6,[7,[8,[9]]]]; // 점점 더 작은 단위로 가게 된다.
pressed2 = [];
-> = [5,6];
arr3 = [7,[8,[9]]];
pressed3 = [];
-> = [7];
arr4 = [8,[9]];
pressed4 = [];
-> = [8];
arr5 = [9]; // 마지막에 더 이상 배열이 존재하지 않을때 재귀의 끝에서부터 리턴이되면서 올라온다.
pressed5 = []; // const press = arrayFlat(arr[i]); 이 할당으로
-> = [9]; // 9를 푸쉬한 pressed5가 리턴되어 press4가 된다
// pressed4.push(...press4); [8].push(...[9])가 되는 셈이다.
// 그렇게 pressed4 = [8,9]가 리턴 되고 그 값은 다시 press3이 된다.
// pressed3.push(...press3); [7].push(...[8,9]) 가 되고
// pressed2.push(...press2); [5,6].push(...[7,8,9])
// pressed1.push(...press1); [3,4].push(...[5,6,7,8,9])
// pressed0.push(...press0); [1,2].push(...[3,4,5,6,7,8,9])
// pressed0 = [1,2,3,4,5,6,7,8,9] 가 된다.
저렇게 그려보니 어떤 느낌인지 알것 같았다.
flat();
을 사용하면 어떤 방향이 될지 한번 해봤더니 이런 방식이 되었다.
let numberArr = [1,2,[3,4,[5,6,[7,[8,[9]]]]]];
function flatAr (arr) {
let result = arr.slice();
for (let i = 0; i < result.length; i++) {
if (Array.isArray(result[i])) {
result = result.flat();
}
}
return result;
}
flatAr(numberArr); // [1,2,3,4,5,6,7,8,9]
배열을 만나면 한번씩 함수를 사용하는 방식으로 작성해봤다.
편하긴 해도 재귀를 연습을 많이 해야겠다.
아직 공부하는 중이라서 부족한 점이 많습니다.
잘못된 부분 언제든 피드백 주시면 감사하겠습니다.