我正在练习递归并使用递归助手方法。在我的助手方法中,出现一个错误,说
类型树中的方法someMethod(K)不适用于参数(K,List,int)。
但是,我不想使用someMethod(K k)
方法,因为我正在尝试使用someMethod(K k, List<K> L, int n)
辅助方法。我如何让Eclipse"知道"我正在尝试使用另一种方法?
到目前为止,我拥有的是:
public List<K> someMethod(K k) {
List<K> L=new LinkedList<K>();
if (lookup(k) != null) {
return someMethod(k, L, 0);
}
return L;
}
private List<K> someMethod(K k, List<K> L, int n) {
if (this.k.compareTo(k) == 0) {
L.add(this.k);
return list;
}
if (this.k.compareTo(k) < 0) {
right.someMethod(k, L, n); //error here
L.add(this.k);
}
if (this.k.compareTo(k) > 0) {
left.someMethod(k, L, n); //error here
L.add(this.k);
}
}
编辑:左右声明:
private Tree<K, V> left, right;
我在第二个方法中看到的第一个问题是,当语句
if (this.k.compareTo(k) == 0)
是真的。
编译器应该会给您一个错误,因为您的方法被声明为返回List<K>
private List<K> someMethod(K k, List<K> L, int n)
要解决此问题,您应该在每个if
语句中或在方法的底部返回一些内容。根据您的逻辑,当没有找到满足上述if
语句的匹配项时,您希望返回一个错误值。因此,例如,您可以通过将以下语句放在方法的底部来返回null
:
return null;
或者,如果您不想处理null
值,则返回一个空列表:
return new ArrayList<K>();
如果你做了这个更改,你的代码在我的机器上编译得很好。
这里有一个Ideone示例,它可以很好地编译我建议的更改
此外,正如@ajb在评论中提到的,您并没有真正考虑递归的基本情况。
意思是,你没有改变论点:
K k, List<K> L, int n
在没有元素满足条件的情况下,当您通过递归传递它们时,会导致"无限"递归,从而导致StackOverFlowError
if(this.k.compareTo(k) == 0) {
L.add(this.k);
return list; // this returns from recursion but nothing else
}
您应该定义某种基本情况,无论是否找到匹配项,都会停止递归。
您的helper方法缺少一个最终的return语句,这可能会打乱语法检查,以这个奇怪的错误消息结束。
private List<K> someMethod(K k, List<K> L, int n) {
if (this.k.compareTo(k) == 0) {
L.add(this.k);
return list;
}
if (this.k.compareTo(k) < 0) {
right.someMethod(k, L, n); //error here
L.add(this.k);
}
if (this.k.compareTo(k) > 0) {
left.someMethod(k, L, n); //error here
L.add(this.k);
}
return L; // change here, errors should be gone now
}