2014-05-14 6 views
-1

Я пытаюсь добавить все кратные 3 или 5 менее 1000 с использованием рекурсивного метода.Ошибка рекурсии Java

Вот мой код

public static void main(String args[]){ 

    //TODO: Find all the multiples of 3 or 5 below 1000 

    //Functional 


    System.out.println(addMultiples(1, 0)); 


    /* 

    //Imperative solution 

    int num = 0; 

    for(int i = 1; i < 1000; i++){ 
     if(i % 3 == 0 || i % 5 == 0){ 
      System.out.println(i + " is a multiple of 3 or 5."); 
      num += i; 
     } 
    } 
    System.out.printf("The sum of all the multiples of 3 or 5 below 1000 is %d", num); 
    */ 

} 

public static int addMultiples(int num, int base){ 

    //Exit case 
    if (num >= 1000) 
     return base; 
    else if (num % 3 == 0 || num % 5 == 0) 
     base += num; 


    addMultiples(++num, base); 

    //I was forced to return a -1. Compiler said. :(
    return -1; 
} 

Почему этот код возвращает -1? Понятно, что если num >= 1000, рекурсия остановится. Я попытался положить System.out.println(base) внутри моего условия выхода, и он распечатывал номер, который я хотел.

Кроме того, почему компилятор сказал мне вернуть -1?

+1

Он всегда будет возвращать '-1', так как вы всегда будете возвращать это значение. Дважды проверьте пути выполнения. – Makoto

+0

remove 'return -1' и make' return addMultiples (++ num, base); ' –

+2

Интересно, какой компилятор заставит кого-то вернуть' -1' ... –

ответ

4

В конце концов базовый футляр вызывается и возвращает base, что бы это ни было. Но все вызовы под ним в стеке игнорируют его и возвращают -1.

Просто рекурсивный случай возврата независимо рекурсивные возвращает вызов:

return addMultiples(++num, base); 
+0

Не могли бы вы объяснить, что я сделал неправильно. Я понимаю, что случай выхода, который я хотел, был действительно выполнен, но почему стек проигнорировал его? – mpmp

+0

@MiguelPortugal, 'return -1' - главная ошибка, которую вы сделали. – Rahul

+0

@MiguelPortugal Вы не используете возвращаемое значение. Вы только вызываете метод и не используете возвращаемое значение. – gparyani

3

Ответ прост. Замените следующий код

addMultiples(++num, base); 
return -1; 

с этим:

return addMultiples(++num, base); 

Что вы делаете в вашем коде, что вы просто вызова рекурсивный метод снова и отбрасывая ее возвращаемое значение, и возвращает -1, если базовый случай не выполняется. В новом коде вы фактически используете возвращаемое значение и правильно вызываете рекурсивный метод.

+2

+1 для добавления объяснения. – Rahul

Смежные вопросы