const printArray = function () {
// TODO
};
ㅈ...재귀!! 분명히 [1,2,[3,4,[[5]],,6,]7]
이런 배열이 테스트케이스로 들어올테니, 인덱스가 배열이면 그 배열을 재귀돌리고 배열이 아니면 숫자를 출력 후 재귀, 공통적으로 재귀돌릴 때 인자는 0번째 인덱스를 뺀 나머지 배열, 종료조건은 재귀들어온 배열의 길이가 0일 때.
재귀는 아 이렇게 짜면 되지 않을까~ 생각하는 것 까지는 머리 쥐어짜내면 어떻게 하겠는데, 막상 짜놓고 보면 내가 생각했던거랑 다르게 동작할 때가 많고, 거기서 고쳐보겠다고 여기저기 손대다 보면 나중엔 이상한 혼종이 되어있는 경우가 많다. 어, 이거 산으로 간다 싶으면 과감하게 싹 날리고 처음부터 다시 짜보는게 차라리 나을때가 많다.
const printArray = function (array) {
function _print(targetArr) {
// 종료조건 : 인자 배열의 길이가 0인 경우
if (targetArr.length === 0) {
return;
} else {
// 인자배열의 0번째 인덱스를 볼거다.
let temp = targetArr[0];
// 0번째 인덱스가 배열이면 해당 인덱스를 재귀, 그 인덱스 뺀 나머지 배열 재귀
if (Array.isArray(temp)) {
_print(temp);
_print(targetArr.slice(1));
// 0번째 인덱스가 배열 아니면 콘솔에 찍고 그 인덱스 뺀 나머지 배열 재귀
} else if (temp) {
console.log(temp);
_print(targetArr.slice(1));
// 0번째 인덱스가 비어있는 경우, 그 인덱스 뺀 나머지 배열 재귀
} else {
_print(targetArr.slice(1));
}
}
}
_print(array);
};
다 짜여있는 코드를 보면 아~ 이렇게~ 하고 납득이 되는데 내가 짜려고 하면 잘 안 된다. 그나마 위안은 그래도 이제 납득은 된다는 점이다. 이 코드같은 경우는 며칠간 매일 좀 또 짜보고 또 짜보고 하면서 재귀랑 친해져야 할 것 같다.
const Tree = function (data) {
this.data = data;
this.children = [];
};
Tree.prototype.addChild = function(child) {
// your code here
};
Tree.prototype.map = function(callback) {
// your code here
};
add는 새 트리 하나 만들어서 this 의 children 에다가 push하면 되니까 ok. 그런데 map 의 경우에는 노드들에 callback만 적용하면 되는게 아니라 새 트리를 반환해야 한다니 머리위에 물음표가 찍히기 시작했다. 트리 순회하는건 그렇다 쳐도 새 트리를 어떻게 만들라는거지?
const Tree = function (data) {
this.data = data;
this.children = [];
};
Tree.prototype.addChild = function(child) {
const node = new Tree(child);
this.children.push(node);
return this
};
Tree.prototype.map = function(callback) {
const newTree = new Tree();
newTree.data = callback(this.data);
newTree.children = this.children.map(function(child) {
return child.map(callback)
});
return newTree;
}