【问题标题】:Stack overflow exception thrown for no reason when trying to print all balanced binary strings with length n尝试打印长度为 n 的所有平衡二进制字符串时无缘无故抛出堆栈溢出异常
【发布时间】:2021-03-04 04:45:12
【问题描述】:

这两个方法在相互使用时会抛出堆栈溢出异常。第一个是使用递归生成所有二进制字符串,第二个是检查它是否平衡。你知道为什么吗?当我独立运行它们时,它们运行正常。 str 将在开头输入为空字符串,n 为所需的字符串大小。

public static void printEqualBinaries(String str, int n) {
        if (str.length() == n && 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);
    }

【问题讨论】:

  • 你能明确说明你想要这个做什么吗?谢谢。

标签: java recursion binary concatenation stack-overflow


【解决方案1】:

使用输入参数(str.lenght() != n ) 对该方法printEqualBinaries(str, n); 的每次调用都会变成一个无限循环,因为条件(str.length() == n ) 总是评估为假;

如果您为 k1 和 k2 添加“停止”条件,您将获得 4 个二进制字符串,例如printEqualBinaries("", 13); 1848 个结果如(HashMap 输出):

{1110001010110 = 0001110100101 = 001011101001 = 0001110010110,10010101010101,1110101010101,1110101010101,11101000101011,1101011001011,1010110011101 = 0101001100010,1101001100010,10010100101000 = 011010010110 = 0110101101001等。}

当然假设这就是你所说的平衡。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-07
    • 1970-01-01
    相关资源
    最近更新 更多