Java 尝试打印长度为n的所有平衡二进制字符串时无故引发堆栈溢出异常

Java 尝试打印长度为n的所有平衡二进制字符串时无故引发堆栈溢出异常,java,recursion,binary,concatenation,stack-overflow,Java,Recursion,Binary,Concatenation,Stack Overflow,这两个方法在相互使用时引发堆栈溢出异常。第一个是使用递归生成所有二进制字符串,第二个是检查它是否平衡。你知道为什么吗?当我独立运行它们时,它们运行正常。str将在开头作为空字符串输入,n是字符串的所需大小 public static void printEqualBinaries(String str, int n) { if (str.length() == n && isBalanced(str,n)) { System.out.pri

这两个方法在相互使用时引发堆栈溢出异常。第一个是使用递归生成所有二进制字符串,第二个是检查它是否平衡。你知道为什么吗?当我独立运行它们时,它们运行正常。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);
    }
publicstaticvoid打印等式(stringstr,intn){
如果(str.length()==n&&isBalanced(str,n)){
系统输出打印项次(str);
回来
}
字符串k1=str+1;
印刷等式(k1,n);
字符串k2=str+0;
印刷均质性(k2,n);
}
公共静态布尔值isBalanced(字符串str,int n){
如果(n%2==0){
int指数=n/2-1;
int sumleet=0;

对于(int i=0;i此方法的每个调用
printEqualBinaries(str,n);
和输入参数
(str.lenght()!=n)
成为一个无限循环,因为条件
(str.length()==n)
总是计算为false

如果为k1和k2添加“停止”条件,则在您的案例中以及例如printEqualBinaries(“,13”);1848个结果(HashMap输出):

{111000010110=000111010001、1101000100101=00101111010、111000101001=000110010110、1001010101010=01101010101、1101000111000=00101110001111、10101100111101=0101001100010、1001010010110=011010101001等}


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

你能澄清一下你到底想做什么吗?谢谢。