1

我正在练习递归并使用递归辅助方法。在我的辅助方法中,出现一个错误,说明

Tree 类型中的方法 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;
4

2 回答 2

0

您的辅助方法缺少最终的返回语句,这可能会弄乱语法检查,并以这个奇怪的错误消息结尾。

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
}
于 2014-11-06T01:03:20.653 回答
0

我在第二种方法中看到的第一个问题是,你只在语句的情况下返回一些东西

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
}

您应该定义某种基本情况,无论您是否找到匹配项,都将停止递归。

于 2014-11-06T01:04:23.030 回答