【发布时间】:2019-05-08 18:47:46
【问题描述】:
我有一个表示树的平面数组,我想使用尾递归构建一个嵌套对象。
我有以下代码可以运行并生成所需的输出,但我不确定它是否是尾递归的正确实现。
请指教:)
const myArray = [
{ id: 'root' },
{ id: 0, parent: 'root' },
{ id: 1, parent: 'root' },
{ id: 2, parent: 0 },
{ id: 3, parent: 1 },
{ id: 4, parent: 2 },
{ id: 5, parent: 1 },
{ id: 6, parent: 4 },
{ id: 7, parent: 0 },
{ id: 8, parent: 0 },
];
function makeNestedTreeFromArray(array, id, children) {
if (children.length <= 0) {
return array.find(entry => entry.id === id);
}
return ({
...array.find(entry => entry.id === id),
children: children.map(child => makeNestedTreeFromArray(
array,
child.id,
array.filter(entry => entry.parent === child.id),
))
});
}
const myTree = makeNestedTreeFromArray(
myArray,
'root',
myArray.filter(entry => entry.parent === 'root'),
);
console.log(myTree);
【问题讨论】:
-
不,它不是,顺便说一句,这是一个非常糟糕的算法,需要大量迭代才能找到孩子。对于尾递归,您需要通过函数本身返回最后一个表达式,而不是在某些对象之间或内部。
-
检查这个 SO 答案,我认为就复杂性和递归而言,这是最好的解决方案(它假设列表已排序) - stackoverflow.com/a/18018037/2332159
标签: javascript recursion tail-recursion