@andrew_1985
Хочу стать программистом

Как работает рекурсия в массиве?

Есть код:

class RecTest{
    int values[];
    RecTest(int i){
        values=new int[i];
    }
    void printArray(int i){
        if(i==0) return;
        else printArray(i-1);
        System.out.println("["+(i-1)+"]"+values[i-1]);
    }
}
public class Recursion2{
    public static void main(String args[]){
        RecTest ob=new RecTest(10);
        int i;
        for(i=0;i<10;i++) ob.values[i]=i;
        ob.printArray(10);
    }
}


И результат
результат работы [0]0
[1]1
[2]2
[3]3
[4]4
[5]5
[6]6
[7]7
[8]8
[9]9

По моей логике:
1.   for(i=0;i<10;i++) ob.values[i]=i; // заполняются элементы массива от 0 до 9 соответственно
2.  Затем отрабатывает ob.printArray(10);
Где 
 if(i==0) return;
 else printArray(i-1);    отрабатывает от 10 до 0 и на выход

в итоге System.out.println вообще не должно использоваться а оно выводит, как это работает?
  • Вопрос задан
  • 115 просмотров
Решения вопроса 1
@xez
Middle Junior Roo
Работает это так:
Когда i становится равной 0, отрабатывает return.
Этот return возвращает в то место, откуда был вызван метод printArray (помним, что он вызывался рекурсивно).
Следующей строкой после вызова printArray идет System.out.println("["+(i-1)+"]"+values[i-1]);, которая и выполняется соответствующее число раз для соответствующих i
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Bavashi
@Bavashi
Чтобы понять как работает код, можно попробовать "продебажить его вручную" расставив выводы, по которым можно ориентироваться. Например, так:
class RecTest{
    int values[];
    RecTest(int i){
        values=new int[i];
    }
    void printArray(int i){
        System.out.println("i on input = " + i);
        if(i==0) {System.out.println("i on zero = " + i); return;}
        else {System.out.println("i on recursion = " + i); printArray(i-1);};
        System.out.println("i on exit = " + i);
        System.out.println("["+(i-1)+"]"+values[i-1]);
    }
}
public class Recursion2{
    public static void main(String args[]){
        RecTest ob=new RecTest(10);
        int i;
        for(i=0;i<10;i++) ob.values[i]=i;
        ob.printArray(10);
    }
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
ВДком Самара
от 100 000 ₽
Gaskar Group Москва
от 100 000 ₽
Сбербанк Ростов-на-Дону
от 100 000 ₽