递归(JavaScript)-不会在“ IF”语句中退出递归

时间:2018-11-22 03:10:19

标签: javascript recursion tree

我正在学习Javascript中的递归,这是到目前为止我得到的。此函数遍历树并找到具有匹配名称属性的对象。由于需要将起点设置为根,因此我创建了一个递归,以将根用作起点。

for循环中途的第一个if语句应返回匹配项。我已经在控制台中对其进行了调试,因此我知道该返回由于任何我不知道的原因而无法正常工作(任何见解都将有助于学习!)。

设置的控制台按照我的预期进行记录,布尔检查表明确实发生了匹配,但是最后仍然变得不确定!

findInTree(name) {
    let start = this.first();   //root object of the tree

    function findName (start, name) {
      if (start.name === name) {
        return start;
      } else {
        for (let set of start.offspring) {
          if (set.name === name) {
            console.log(set);   // returns the correct set!
            console.log(set.name === name)  //returns true;
            return set;
          } else {
            findName(set, name);
          }
        }
      }
    }
    return findName(start, name);
  }
// returns undefined...

2 个答案:

答案 0 :(得分:0)

如果递归找到了您要查找的内容,您只想从循环中返回。否则,您想继续循环。您可以测试结果并决定是否返回:

let obj = {
    first: {
        name: "test",
        offspring:[
            {name: "test1", offspring:[]},
            {name: "test2", offspring:[{name:"test21", offspring:[]}]},
            {name: "test3", offspring:[
                {name: "test31", offspring:[]}
            ]},
        ]
    },
    findInTree(name) {
    let start = this.first;   //root object of the tree

    function findName (start, name) {
      if (start.name === name) {
        return start;
      } else {
        for (let set of start.offspring) {
          if (set.name === name) {
            console.log(set);   // returns the correct set!
            console.log(set.name === name)  //returns true;
            return set;
          } else {
            let found = findName(set, name); // only return if you've found 
            if (found) return found          // what you're looking for
          }
        }
      }
    }
    return findName(start, name);
  }
}
console.log(obj.findInTree("test31"))

答案 1 :(得分:0)

您认为这行得通吗?将递归调用移出for循环。只有在for循环中找不到匹配项时,才调用函数findName。如果可能的话,可以将代码放在jsfiddle或其他地方,以便我看看。

    findInTree(name) {
    let start = this.first();   //root object of the tree

    function findName (start, name) {
      if (start.name === name) {
        return start;
      } else {

        for (let set of start.offspring) {
          if (set.name === name) {
            console.log(set);   // returns the correct set!
            console.log(set.name === name)  //returns true;
            return set;
          }
        }
       return findName(set, name);   //if the match is not found in the forloop, we call findname

      }
    }
    return findName(start, name); 
}