Рекурсия внутри цикла while, Как это работает? - PullRequest
4 голосов
/ 18 июня 2010

Подскажите, пожалуйста, как работает этот код Java? :

public class Main {
    public static void main (String[] args)  {
        Strangemethod(5);
    }
    public static void Strangemethod(int len) {
        while(len > 1){
            System.out.println(len-1);
            Strangemethod(len - 1);
        }
}
}

Я пытался отладить его и шаг за шагом следовать коду, но я не понял этого.

обновление: извините, я не упомянул, что знаю результат этого кода, но просто хочу знать этапы выполнения ..

Ответы [ 7 ]

13 голосов
/ 18 июня 2010

Это напечатает 4 3 2 1 1 1 1 1 1 ...

И застрять в цикле, потому что ничто не изменяет len в области видимости цикла while. Первые вызовы (с len = 5, 4, затем 3) проходят одну итерацию цикла и остаются в ожидании возврата Strangemethod. Когда len = 2, цикл while вызывает странный метод (1), и поскольку len не больше 1, цикл while завершается, и этот вызов возвращается. Но len по-прежнему равен 2 в самом нижнем оставшемся цикле whle, поэтому он снова вызывает странный метод (2). И опять. И снова.

if () было бы более подходящим, чем while ().

2 голосов
/ 18 июня 2010

Если я не ошибаюсь, не вызывает ли это бесконечный цикл?

Как только странный метод (1) возвращает странный метод (2) снова напечатает 1, а затем снова вызовет странный метод (1).

Вы забыли уменьшить значение len после вызова странного метода?

2 голосов
/ 18 июня 2010

РЕДАКТИРОВАТЬ: К сожалению для первого ответа не понял это ... это приведет к бесконечному циклу

Вот простой поток - например, len = 5

 public static void Strangemethod(5) {
            while(5 > 1){
                System.out.println(5-1);
                Strangemethod(5 - 1);
            }
public static void Strangemethod(4) {
            while(4 > 1){
                System.out.println(4-1);
                Strangemethod(4 - 1);
            }
public static void Strangemethod(3) {
            while(3 > 1){
                System.out.println(3-1);
                Strangemethod(3 - 1);
            }
    public static void Strangemethod(2) {
            while(2 > 1){
                System.out.println(2-1);
                Strangemethod(2 - 1);
            }
    public static void Strangemethod(1) {
            while(1 > 1){//goes back to original(above) call and then an infinite loop since len was never  decremented

            }

Отпечатки 4 3 2 1 1 .....

1 голос
/ 18 июня 2010

Попробуйте добавить len--; после Strangemethod(len - 1);.Тогда это не отправит вас в бесконечный цикл.В качестве альтернативы, вы можете сделать

System.out.println(--len);
Strangemethod(len);
1 голос
/ 18 июня 2010

Вы не говорите, что ожидаете от кода.Тем не менее, очевидное замечание, что переменная len не меняет значение в методе Strangemethod - оно могло быть объявлено final.Возможно, вы хотели уменьшить его на --len; (эквивалентно len = len - 1;).

0 голосов
/ 18 июня 2010

Кроме того, я думаю, что кто-то должен указать, что len никогда не уменьшается, поэтому вы получаете бесконечный цикл.Я вижу, что только 7 человек упомянули это до сих пор.

0 голосов
/ 18 июня 2010

Этот код будет зациклен навсегда.

Результат len - 1 никогда не сохраняется в цикле while, поэтому он не может выйти, а когда len = 2 он просто будет сидеть там, выводя 1с.while в рекурсивных функциях.Обычно я ожидаю увидеть if на его месте, что даст вам вывод:

4
3
2
1

Если вам действительно нужен while, тогда я бы переписал цикл следующим образом:

while(len > 1)
{
  len--;
  System.out.println(len);
  Strangemethod(len);
}

Будет выведено:

4
3
2
1
1
2
1
1
3
2
1
1
2
1
1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...