Рекурсивные функции всегда имеют как минимум 2 пути, нормальные, которые будут рекурсивно, и возвращаемые пути «end» (обычно константа).
Вы можете, однако, сделать что-то вроде этого:
public static int addNumbers(int value) {
if (value != 1)
value = value + addNumbers(value-1);
return value;
}
Но я не могу сказать, что я думаю, что это гораздо лучше (Некоторые люди, как раздражен на изменение параметров, как они делают в нескольких возвратов). Конечно, вы могли бы создать новую переменную и установить ее на одно значение или другое, но тогда кто-то расстроится, потому что вы использовали слишком много строк кода и ненужную переменную. Добро пожаловать в программирование :) Ваш исходный код, вероятно, так хорош, как вы, вероятно, получите.
Что касается того, почему «Eclipse» сделал это с вами, это на самом деле Java - Java лучше, чем большинство языков, при условии, что вы не сделали что-то явно неправильное как можно скорее (в этом случае, пока вы печатаете ожидающих вас для компиляции). Он обнаружил, что одна ветка вашего if вернула значение, а другая - нет, что явно неверно.
Java также очень ярок, заставляя вас использовать инструкцию «return», где другой язык может позволить вам уйти с меньшим количеством. В Groovy Вы бы соблазн устранить возвращение и написать что-то вроде:
def addNumbers(value){value + (value-1?0:addNumbers(value-1))}
просто для удовольствия, но я, конечно, не назвал бы более удобным для чтения! Java просто показывает, что лучше заставить вас быть явным в большинстве случаев.
* Eclipse заставил меня написать два возвращения *: что это значит? Что конкретно сказал «Затмение»? О каком коде? Что не так с приведенным выше кодом и почему вы думаете, что у вас должно быть только одно возвращение? Как выглядит код? Почему бы вам просто не использовать 'return value + addNumbers (value-1);' вместо 'return value = value + addNumbers (value-1);'? –