繁体   English   中英

Java 不从递归 if/else 语句中返回

[英]Java not returning from inside a recursive if/else statement

我有一个 if/else 语句,它递归地调用自身以在二叉搜索树中查找值。

  public BST<E> lookup(BST T, Comparable data) {
 
    
    if (T.getData() == null) {
      return null;
    }
    else if (T.getData().equals(data)) {
      return T;
    }
    else {
      if (data.compareTo(T.getData()) < 0) {
        T = T.getLeft();
        lookup(T, data);
      }
      else {
        T = T.getRight();
        lookup(T.getRight(), T.getData());
      }
    } 
  
  }

当我尝试编译该程序时,发现末尾没有 return 语句,这让我很沮丧。 该程序最终应该会遇到一个 return 语句,但为了使其编译,我在最后添加了一个 return 语句。 但是程序总是从该语句返回 - 即使它在 else-if 语句中说要return T 我知道它到达那个语句,但我不知道为什么它不从那个语句中返回。

该方法根本不返回。 递归并不神奇。

lookup(T.getRight(), T.getData())就是这个意思。 没有什么不同只是因为它是你自己的方法。 也许您认为:太好了,这将完全中止此方法调用并将其从存在中消除,从顶部重新启动,并且IT现在控制值的返回。

没有。 方法是可重入的:这只是..调用一个查找方法(恰好是相同的方法,但这无关紧要),将运行它直到它返回一些东西,然后代码跳回到你调用查找的地方并继续它的快乐方式.

因此,为什么永不结束的递归会导致 StackoverflowErrors - 系统正在记住所有这些查找方法,因为它们都仍在运行(当然,除了一个,所有这些方法都在等待另一个查找方法首先完成。这不是多线程,只是多个正在进行的调用)。

请记住,与普通方法调用没有区别 如果你写这段代码:

int foo() {
  return  scanner.nextInt();
}

然后,当 JVM 执行此方法时,它将调用scanner变量指向的 object 上的nextInt()方法,等待它完成,然后获取它返回的内容并自行返回,使用这个值。

递归也不例外。

我很确定您在这里想要的只是返回递归调用返回的任何内容,因此,您需要的只是将lookup(T, data)替换为 `return lookup(T, data)。

请注意,您的 else class 首先用它的右分叉替换 T,然后再次选择右分叉。 我敢打赌你不想要那个。

此外,命名变量T几乎是可以想象的最糟糕的名称。 大写单个字母保留用于类型参数。 方法参数的正确命名约定是 SomethingLikeThis(驼峰式,首字母小写)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM