Рекурсивный цикл Java - PullRequest
       1

Рекурсивный цикл Java

0 голосов
/ 08 октября 2019

Я пытаюсь остановить этот рекурсивный цикл в Java.

Я создал программу, которая печатает числа, такие как Вывод: 1 2 3 4 5 6 5 4 3 2 1 0 1 2 3 4 5 6 54 3 2 1

Это как создать волну растущих и убывающих чисел. Но я хочу остановиться, когда он получит больше, чем длина строки. Может кто-нибудь дать альтернативный способ.

boolean isboolean = true;

public void recursive(int data, String s) {
    int counter = 0;

    Loop1:
    while (isboolean) {
        counter++;
        data = data + 1;
        System.out.print(data + " ");
        if (data > 5) {
            isboolean = false;
        }
        if (counter > s.length()) break Loop1;
    }
    Loop2:
    while (!isboolean) {
        data = data - 1;
        System.out.print(data + " ");
        if (data == 0) {
            isboolean = true;
        }
    }
    recursive(data, s);
}

Я хочу остановить эту волну чисел, когда она получит больше длины строки. И выводит вывод: 1 2 3 4 5 6 5 4 3 2 1 0 1 2 3 4 5 6 5 4 3 2 1, но останавливается, когда длина строки больше.

Ответы [ 3 ]

3 голосов
/ 08 октября 2019

С небольшими исправлениями:

1 - объявить счетчик снаружи

2 - сделать условия длины для обоих циклов

3 - остановить рекурсию, когда длина достигнет

4- счетчик должен увеличиваться в обоих циклах.

5 - теперь нет необходимости в маркированном цикле.

boolean isboolean= true;
int counter = 0;

public void add(int data, String s) {

    //Loop1:
    while (isboolean && counter <= s.length()) {
        counter++;
        data = data + 1;
        System.out.print(data + " ");
        if (data > 5) {
            isboolean = false;
        }
    }
    //Loop2:
    while (!isboolean && counter<= s.length()) {
        counter++;
        data = data - 1;
        System.out.print(data + " ");
        if (data == 0) {
            isboolean = true;
        }
    }
    if (counter<=s.length())
        add(data, s);
}
0 голосов
/ 08 октября 2019

Лучшим подходом было бы передать значение counter, а не использовать подверженную ошибкам глобальную переменную для counter (поскольку это приведет к неправильным значениям при вызове более одного раза) . А во-вторых, вы можете упростить оба ваших цикла в один цикл:

public void recursive(int data, String s, int counter) {
    boolean increment = true;

    while (counter <= s.length()) {
        counter++;
        if (increment)
            data += 1;
        else
            data -= 1;
        System.out.print(data + " ");
        if (increment && data > 5) {
            increment = false;
        } else if (!increment && data == 0) {
            break;
        }
    }

    if (counter <= s.length()) {
        recursive(data, s, counter);
    }
}

И вызывать свой метод следующим образом:

recursive(0, "abcdefghijklmno", 1);

Вывод:

1 2 3 4 5 6 5 4 3 2 1 0 1 2 3
0 голосов
/ 08 октября 2019

Для ваших нужд вам не нужен рекурсивный цикл, это будет делать то, что вы хотите

Так что для ваших нужд вы бы поставили min как 0 max как 6 и offset как 0:

private static void numberWave(String text, int min, int max, int offset) {
    for (int i = min+offset; i < text.length()+min+offset ; i++) {
        int deltaMX = max-min;
        int counterMod = ((i)%(deltaMX));
        int upWards = min+counterMod+1;
        int downWards = min+(deltaMX-counterMod-1);
        boolean counterPart = (i)%(deltaMX*2)<deltaMX;
        System.out.print((counterPart?upWards:downWards)+" ");
    }
}

Ввод: numberWave("Hello world" , 0 , 6 , 0 )

Выход: 1 2 3 4 5 6 5 4 3 2 1 0 1 2 3

...