【问题标题】:Why recursion function doesn't need return为什么递归函数不需要return
【发布时间】:2018-07-13 10:41:12
【问题描述】:

我试图合并两个二叉树,如果我使用“return root;”最后,系统告诉我“错误:找不到符号:变量根”。当我添加“return root;”时它可以工作到每一个条件。我不明白为什么。此外,根据我过去的经验,似乎我不必在递归函数调用之后编写返回语句。有人可以解释一下吗?谢谢!

 public TreeNode mergeTrees(TreeNode t1, TreeNode t2) {
    if (t1 == null && t2 == null) {
        return null;
    }
    else if (t1 == null) {
        TreeNode root = new TreeNode(t2.val);
        root.left = mergeTrees(null, t2.left);
        root.right = mergeTrees(null, t2.right);
    }
    else if (t2 == null) {
        TreeNode root = new TreeNode(t1.val);
        root.left = mergeTrees(t1.left, null);
        root.right = mergeTrees(t1.right, null);
    }
    else {
        TreeNode root = new TreeNode(t1.val + t2.val);
        root.left = mergeTrees(t1.left, t2.left);
        root.right = mergeTrees(t1.right, t2.right);
    }
    return root;
}

【问题讨论】:

  • 您在 else 语句中声明了 root,当它遇到您的 return 语句时,它就失去了作用域。如果要返回它,请在 if 语句开始之前声明 root,否则从 else 中返回它。

标签: recursion return binary-tree


【解决方案1】:

你的变量 root 在你的 if、else if 和 else 语句中声明,因此一旦你到达 if 语句块之外的 return,它就会失去作用域。如果你想返回root,我建议这样做。

     public TreeNode mergeTrees(TreeNode t1, TreeNode t2) {
     TreeNode root; //Declare it here so it doesn't lose scope
     if (t1 == null && t2 == null) {
         return null;
     }
     else if (t1 == null) {
         root = new TreeNode(t2.val);
         root.left = mergeTrees(null, t2.left);
         root.right = mergeTrees(null, t2.right);
     }
     else if (t2 == null) {
         root = new TreeNode(t1.val);
         root.left = mergeTrees(t1.left, null);
         root.right = mergeTrees(t1.right, null);
     }
     else {
         root = new TreeNode(t1.val + t2.val);
         root.left = mergeTrees(t1.left, t2.left);
         root.right = mergeTrees(t1.right, t2.right);
     }
         return root;
     }

【讨论】:

    【解决方案2】:

    除非您使用 JavaScript 编程并使用 var,否则大多数 algol languages 中的变量具有块范围。因此:

    {                                       // new block scope started
      TreeNode root = new TreeNode(t2.val); // New variable TreeNode created
    }                                       // Everything created in this scope gets destroyed
    root; // Would no compile as root is an unbound variable
    

    如果要创建要返回的变量,则需要在与返回相同的范围内创建它。因此:

    {
      TreeNode root = null; 
      // .. you logic goes here
      return root; 
    } // root goes out of scope here
    

    琐事:我提到了 JavaScript,在那种语言中使用 var 你的代码可以工作:

    function mergeTrees(t1, t2) {
        if (t1 === null && t2 === null) {
            return null;
        }
        else if (t1 === null) {
            var root = new TreeNode(t2.val);
            root.left = mergeTrees(null, t2.left);
            root.right = mergeTrees(null, t2.right);
        } else if (t2 === null) {
            var root = new TreeNode(t1.val);
            root.left = mergeTrees(t1.left, null);
            root.right = mergeTrees(t1.right, null);
        } else {
            var root = new TreeNode(t1.val + t2.val);
            root.left = mergeTrees(t1.left, t2.left);
            root.right = mergeTrees(t1.right, t2.right);
        }
        return root;
    }
    

    这样做的原因是var 将最近的函数关联为范围,条件中的块不会引入新范围。 ES6 已经用letconst 修复了这个问题,尽管它们与其他algol 语言的工作方式相同,但使用它们的风格更好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-05
      • 2022-11-21
      • 2011-04-13
      • 2018-02-08
      • 2020-09-14
      • 1970-01-01
      相关资源
      最近更新 更多