Проблема понимания рекурсии здесь - PullRequest
0 голосов
/ 18 сентября 2018

Может кто-нибудь помочь мне объяснить, почему это заканчивается бесконечным циклом рекурсии?

Переменная длина достигает значения 1, но по какой-то причине цикл все еще вводится, хотя условие цикла является(длина> 1).

Я пробовал печатать значения и запускать их снова и снова, возможно, я упускаю что-то более очевидное или кто-то может объяснить это более просто.Спасибо.

public static void main(String[] args) {
    xMethod(5);
}

public static void xMethod(int length) { 
    while (length > 1) {
        System.out.print((length - 1) + " ");
        xMethod(length - 1);
    }
}

Дополнительная информация.

Когда я дублировал этот код:

public static void main(String[] args) {
    xMethod(5);
}

public static void xMethod(int length) { 
    while (length > 1) {
        System.out.print((length - 1) + " ");
        xMethod(length - 1);
    }
    System.out.println("Coming out of while");
}

Ниже вывод:

4 3 2 1 Coming out of while
1 Coming out of while
1 Coming out of while
1 Coming out of while
1 Coming out of while
1 Coming out of while
1 Coming out of while
//repeated Infinite times

После выхода из цикла while, почему он возвращается в тот же цикл while с length как 2?

Редактировать: Я ценю все ваши ответы и понимаю, что еслиЯ хотел закодировать что-то вроде этого, я, вероятно, использовал бы оператор if, как это делают большинство рекурсивных методов, но это просто вопрос меня, возможно, не понимающего, как работает область действия или стек вызовов.Если я прав, блок цикла while удерживает значение длины как 2 независимо от того, что происходит за пределами этого блока?

Ответы [ 4 ]

0 голосов
/ 18 сентября 2018

Вы делаете 2 вещи здесь.Когда вы пишете рекурсивный код, вам всегда нужно думать, когда код закончится.Ваш код не имеет конечного регистра.

public static void main(String[] args) {
             xMethod(5);
}

public static void xMethod(int length) { 

     System.out.println("Method Start "+ length);
        while (length > 1) {

            System.out.println("Inside while "+ length);

             xMethod(length - 1);
        }
        System.out.println("Method End "+ length);                 
    }
}

Теперь этот код выдает следующий вывод:

Method Start 5
Inside while 5
Method Start 4
Inside while 4
Method Start 3
Inside while 3
Method Start 2
Inside while 2
Method Start 1
Method End 1
Inside while 2
Method Start 1
Method End 1
Inside while 2
Method Start 1
Method End 1
Inside while 2
Method Start 1
Method End 1
.
.

Как ясно видно,

Inside while 2
Method Start 1
Method End 1

повторяется снова и снова.

Итак, что это значит, когда длина равна 2, произойдет следующее:

while (2 > 1) {
     System.out.println("Inside while "+ length);
     xMethod(1);
}

Выход для этого будет

Inside while 2

Теперь, xMethod(1) даже не входит в цикл while, так что это будет напечатано.

Method Start 1
Method End 1

Но теперь вы должны понимать, что while(2>1) снова выполняется, потому что длина не изменилась, и она все еще 2.

while (2 > 1){
    System.out.println("Inside while "+ length);
    xMethod(1);
}

продолжается и цикл продолжается.

0 голосов
/ 18 сентября 2018

Переменная длина никогда не достигает значения 1 в любом цикле, вы смешиваете два дизайна, и я думаю, что вам нужен один из них, рекурсивный метод или цикл.

первый дизайн:

public static void main(String[] args) {
    xMethod(5);
}
public static void xMethod(int length) { 
    System.out.print((length - 1) + " ");
    if(length > 1)
        xMethod(length - 1);
    }
}

другой способ:

public static void main(String[] args) {
    xMethod(5);
}
public static void xMethod(int length) {
    while (length > 1) {
        System.out.print((length--) + " ");
    }
}

Вы можете выбрать один из них, это зависит от вашего дизайна.если это не ваш ответ, пожалуйста, напишите ожидаемый результат.

0 голосов
/ 18 сентября 2018

потому что, когда length достигает 2 xMethod(2), вызывается и, следовательно, xMethod(1) следует, когда xMethod(1) заканчивается, так как length все еще 2, он снова вызывает xMethod(2), и this вызывает xMethod(1) повторяется ..

чтобы исправить это, используйте return после xMethod(length - 1);

public static void main(String[] args){
        xMethod(5);
    }

    public static void xMethod(int length) { 

        while (length > 1) {

            System.out.print((length - 1) + " ");

             xMethod(length - 1);
             return;
        }
        System.out.println("Coming out of while");
    }
0 голосов
/ 18 сентября 2018

Поскольку вы не обновляете значение длины в текущем методе. Значение просто уменьшается при отправке методу.

public static void main(String[] args) {
    xMethod(5);
}

public static void xMethod(int length) {
    while (length > 1) {
        System.out.print((length) + " ");
        xMethod(length);
        length--;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...