Исключение переполнения стека, возникающее без причины при попытке напечатать все сбалансированные двоичные строки длиной n

#java #recursion #binary #concatenation #stack-overflow

#java #рекурсия #двоичный #конкатенация #переполнение стека

Вопрос:

Эти два метода генерируют исключение переполнения стека, когда они используют друг друга. Первое — создать все двоичные строки с использованием рекурсии, а второе — проверить, сбалансировано ли оно. Вы знаете почему? Когда я запускаю их независимо, они выполняются нормально. str будет введен как пустая строка в начале, а n — требуемый размер строки.

 public static void printEqualBinaries(String str, int n) {
        if (str.length() == n amp;amp; isBalanced(str,n)) {
            System.out.println(str);
            return;
        }
        String k1 = str   "1";
        printEqualBinaries(k1, n);
        String k2 = str   "0";
        printEqualBinaries(k2, n);
    }

    public static boolean isBalanced(String str, int n) {
        if (n % 2 == 0) {
            int index = n / 2 - 1;
            int sumLeft = 0;
            for (int i = 0; i <= index; i  ) {
                sumLeft  = Integer.parseInt(Character.toString(str.charAt(i)));
            }
            int sumRight = 0;
            for (int i = index   1; i < str.length(); i  ) {
                sumRight  = Integer.parseInt(Character.toString(str.charAt(i)));
            }
            if (sumLeft == sumRight) {
                return true;
            } else {
                return false;
            }
        } else {
            int index = n / 2;
            int sumLeft = 0;
            for (int i = 0; i < index; i  ) {
                sumLeft  = Integer.parseInt(Character.toString(str.charAt(i)));
            }
            int sumRight = 0;
            for (int i = index   1; i < str.length(); i  ) {
                sumRight  = Integer.parseInt(Character.toString(str.charAt(i)));
            }
            if (sumLeft == sumRight) {
                return true;
            } else {
                return false;
            }
        }
    }
    public static void main(String[] args) {
        printEqualBinaries("", 3);
    }
 

Комментарии:

1. Не могли бы вы уточнить, что именно вы хотите, чтобы это делало? Спасибо.

Ответ №1:

Каждый вызов этого метода printEqualBinaries(str, n); с входными параметрами (str.lenght() != n ) становится бесконечным циклом, поскольку условие (str.length() == n ) всегда принимает значение false;

Если вы добавите условия ‘stop’ как для k1, так и для k2, вы получите 4 двоичных строки в вашем случае и, например, для printEqualBinaries («», 13); 1848 результатов, подобных (вывод хэш-карты):

{1110001010110=0001110101001, 1101000100101=0010111011010, 1110001101001=0001110010110, 1001010101010=0110101010101, 1101000111000=0010111000111, 1010110011101=0101001100010, 1001010010110=0110101101001, и т.д. }

Конечно, при условии, что это то, что вы подразумеваете под сбалансированным.