Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 什么';这个在树中查找节点的简单递归函数有什么问题?_Javascript_Typescript_Recursion - Fatal编程技术网

Javascript 什么';这个在树中查找节点的简单递归函数有什么问题?

Javascript 什么';这个在树中查找节点的简单递归函数有什么问题?,javascript,typescript,recursion,Javascript,Typescript,Recursion,我有一个典型的树形结构,如下所示: [ { id: 42, ...other properties..., subs: [ ...other objects... ] }, ...other objects... ] 它可以有任何形状和数量的节点 我编写了一个方法,该方法应根据节点的id递归地从树中查找并返回节点: private getFromTree(id: number): object { function f(tree: Arra

我有一个典型的树形结构,如下所示:

[
  {
    id: 42,
    ...other properties...,
    subs:
      [ ...other objects... ]
  },
  ...other objects...
]
它可以有任何形状和数量的节点

我编写了一个方法,该方法应根据节点的
id
递归地从树中查找并返回节点:

private getFromTree(id: number): object {

  function f(tree: Array<object>): object {
    for (let n of tree) {
      if (n['id'] == id) return n;
      else if (n['subs'].length > 0) f(n['subs']);
    }
  }

  return f(this.tree);

}
私有getFromTree(id:number):对象{ 函数f(树:数组):对象{ for(让n代表树){ 如果(n['id']==id)返回n; 如果(n['subs'].长度>0)f(n['subs']); } } 返回f(这个树); } 但它不起作用,我想知道为什么

(如果我用
console.log(JSON.stringify(n));
替换
return n;
,那么我可以看到它找到了节点,但是使用
return n;
它总是返回
未定义的
。首先我认为这是因为我在
f(n['subs')之前缺少了第二个
return
);
但如果我把它放在那里,它将只搜索树中的一条路径。)


为什么错了?如果找到节点,为什么会返回
undefined
?我该如何重写它才能正常工作呢?

您错过了报税表。当您递归时,必须返回递归的结果,否则内部调用的返回值将丢失

我错过了一个细节,你有一个数组的元素,每个都有子。。。那个使事情复杂化。您是否保证
id
只能出现一次?如果是的话,这个版本就可以了。如果否,您如何知道哪个元素是该id的正确元素

private getFromTree(id: number): object {

  function f(tree: Array<object>): object {
    for (let n of tree) {
      if (n['id'] == id) return n;
      else if (n['subs'].length > 0) {
        let candidate = f(n['subs']);
        if (candidate != undefined) return candidate;
      }
    }
  }

  return f(this.tree);

}
私有getFromTree(id:number):对象{ 函数f(树:数组):对象{ for(让n代表树){ 如果(n['id']==id)返回n; else if(n['subs'].长度>0){ 设候选者=f(n['subs']); 如果(候选者!=未定义)返回候选者; } } } 返回f(这个树); }
您缺少报税表。当您递归时,必须返回递归的结果,否则内部调用的返回值将丢失

我错过了一个细节,你有一个数组的元素,每个都有子。。。那个使事情复杂化。您是否保证
id
只能出现一次?如果是的话,这个版本就可以了。如果否,您如何知道哪个元素是该id的正确元素

private getFromTree(id: number): object {

  function f(tree: Array<object>): object {
    for (let n of tree) {
      if (n['id'] == id) return n;
      else if (n['subs'].length > 0) {
        let candidate = f(n['subs']);
        if (candidate != undefined) return candidate;
      }
    }
  }

  return f(this.tree);

}
私有getFromTree(id:number):对象{ 函数f(树:数组):对象{ for(让n代表树){ 如果(n['id']==id)返回n; else if(n['subs'].长度>0){ 设候选者=f(n['subs']); 如果(候选者!=未定义)返回候选者; } } } 返回f(这个树); }
id
s是唯一的,所以这不会成为问题。谢谢你,你的解决方案很好。我唯一能理解为什么只有a
返回f(n['subs'])
内,否则
不足。如果没有
候选者!=未定义
条件它将在遍历不匹配的路径后停止,并返回
未定义
?这是通过检查防止的情况吗。。因此,
return
仍然存在,以便内部调用不会丢失,它只是有条件的。这就是我的解释。我说得对吗?@汤姆-是的,没错。如果您有某个根元素是所有元素的共同祖先,那么您可能不需要条件检查。但是因为您的基本元素是一个树数组(
[{…},{…}]
),我们必须做一些事情来确保如果我们到达第一棵树的底部,并且没有找到我们想要的结果,我们会检查后续的树。这是深度优先递归。
id
s是唯一的,所以这不会成为问题。谢谢你,你的解决方案很好。我唯一能理解为什么只有a
返回f(n['subs'])
内,否则
不足。如果没有
候选者!=未定义
条件它将在遍历不匹配的路径后停止,并返回
未定义
?这是通过检查防止的情况吗。。因此,
return
仍然存在,以便内部调用不会丢失,它只是有条件的。这就是我的解释。我说得对吗?@汤姆-是的,没错。如果您有某个根元素是所有元素的共同祖先,那么您可能不需要条件检查。但是因为您的基本元素是一个树数组(
[{…},{…}]
),我们必须做一些事情来确保如果我们到达第一棵树的底部,并且没有找到我们想要的结果,我们会检查后续的树。这是深度优先递归。