【问题标题】:Recursive Tree not giving correct output递归树没有给出正确的输出
【发布时间】:2021-05-13 16:04:08
【问题描述】:

我有一个树对象,它有两个孩子(子树)5 和 6。5 有另一个孩子 7,6 有另一个孩子 8。我想查找树中是否包含任何特定的子树。例如,我编写了一个函数,如果树中存在子树 8,它将返回。

var tree = {
  value: undefined,
  children: [{
    value: 5,
    children: [{
      value: 7,
      children: []
    }]
  }, {
    value: 6,
    children: [{
      value: 8,
      children: []
    }]
  }]
};

我的递归函数:

  var contains = function (node, target) {
    
    for (var i = 0; i < node.children.length; i++) {
      if (node.children[i].value === target) {
        return true;
      } else {
        return contains(node.children[i], target);
      }
      return false;

    }
  };
contains(tree, 8);

如我们所见,树中存在 8,但我的函数返回 false。如果我想检查是否存在 5 或 7,我的函数返回 true,但如果我调用它来搜索 6 或 8,它会返回 undefined。我尝试使用调试器,它显示我的代码没有增加 for 循环来检查5 岁以后的下一个孩子。任何帮助将不胜感激。提前致谢。

【问题讨论】:

  • 你的return false 应该在for 循环之外
  • return false 永远不会执行,但重点是正确的:您总是在循环的第一次迭代中返回,因此不会发生太多迭代。
  • @TKoL 我将 return false 移到了 for 循环之外。但对于 6 或 8 仍然不正确。

标签: javascript recursion data-structures tree


【解决方案1】:

我已经改变了你的一些代码,所以它不会过早地return

var tree = {
  value: undefined,
  children: [{
    value: 5,
    children: [{
      value: 7,
      children: []
    }]
  }, {
    value: 6,
    children: [{
      value: 8,
      children: []
    }]
  }]
};

var contains = function (node, target) {
    
    for (var i = 0; i < node.children.length; i++) {
      if (node.children[i].value === target) {
        return true;
      } else {
        if(contains(node.children[i], target)) return true;
      }
     

    }
     return false;
};

console.log(contains(tree, 8));

【讨论】:

  • 现在工作正常。非常感谢。我还在学习,你介意分享一下你为什么这么想吗?我的方法有什么问题?在做这类问题时,我应该遵循什么心态?
  • @AshequlHaque 递归函数仍然是一个有点难以解释甚至有时难以思考的东西,我没有任何快速的话。在我对您最初的问题的评论中,我只是在脑海中闪过它,这就是我注意到return false 发生得太快的原因——我立即注意到在您处理数组中的第二个项目之前所有路径都已返回,这正是8 所在的位置!
  • @AshequlHaque 这是你必须擅长的重要部分之一,而不仅仅是递归函数:学习如何在你的头脑中运行程序。了解在各种条件下,哪一行代码在每一行代码之后被处理。成为计算机。
猜你喜欢
  • 1970-01-01
  • 2013-10-23
  • 1970-01-01
  • 1970-01-01
  • 2012-05-22
  • 1970-01-01
  • 1970-01-01
  • 2019-09-14
  • 2013-07-30
相关资源
最近更新 更多