Почему рекурсия возвращает первый вызов в стеке, а не последний?

#java #recursion

#java #рекурсия

Вопрос:

Я ни за что на свете не могу понять, почему это возвращает 0, а не 5. «i» продолжает увеличиваться до того, как он попадет в последний оператор return, однако он всегда возвращает 0 с первого вызова в стеке. Я бы подумал, что, поскольку самый последний вызов в стеке сначала возвращает возврат в блоке «i == 5», он вернет и выведет 5.

Возвращает 0

 public static void main(String[] args) {
        System.out.println(incrementI(0));
}       


public static int incrementI(int i) {
    if (i == 5){
        return i;           
    } else {
         incrementI(i   1);
    }

    return i;       
}
  

Возвращает 5

 public static int incrementI(int i) {
    if (i == 5){
        return i;           
    } else {
        return incrementI(i   1);
    }               
}
  

Комментарии:

1. java !== javascript

2. Что something() ?? Это должно быть incrementI() ?

3. Что something(int i) делает?

4. Где рекурсия?

5. Да, предполагается, что что-то должно быть inrementI() , быстрая опечатка, спасибо!

Ответ №1:

Представьте, что вы написали такую функцию:

 public static int square(int x) {
    pow(x, 2);
    return x;
}
  

Он вычислит квадрат x . Но тогда вычисленный квадрат ни на что не повлияет, и функция вернет только x.

Теперь внимательно посмотрите на свой код

 if (i == 5){
    return i;           
} else {
    something(i   1);
}
return i;
  

Если i нет 5 , something(i 1) будет вызван. Тогда он вернет некоторое значение, но это значение ни на что не повлияет. И тогда incrementI функция вернет просто i , в вашем случае это 0 .

Комментарии:

1. предполагается, что что-то inrementI() , быстрая опечатка!

2. @NightSkyCode, похоже, вы упускаете точку зрения Павла. incrementI(i) Функция в вашем первом примере всегда возвращает i : она немедленно возвращает 5 if i==5 , в противном случае она выполняет некоторые действия, а затем возвращает i . Не имеет значения, что такое «некоторые вещи». Не имеет значения, является ли «some stuff» вызовом функции с именем something() или это рекурсивный вызов incrementI() . В любом случае, он делает что угодно, а затем игнорирует результат выполнения чего угодно, а затем возвращает i .