[英]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.