Рекурсия во вспомогательных методах (Java)
Я практикую рекурсию и использую рекурсивный вспомогательный метод. В моем вспомогательном методе появляется сообщение об ошибке
Метод 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;
2 ответа
Первая проблема, которую я вижу во втором методе, заключается в том, что вы возвращаете что-то только в том случае, когда утверждение
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
}
Вы должны определить какой-то базовый вариант, который остановит рекурсию, независимо от того, найдены вы совпадения или нет.
В вашем вспомогательном методе отсутствует последний оператор 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
}