Algorithm 查找有效的括号对don';不行?

Algorithm 查找有效的括号对don';不行?,algorithm,recursion,Algorithm,Recursion,我在做一个没有看答案的编码问题,我在努力寻找我的思维过程中的错误 问题是找到有效的n对括号的所有组合 当我运行这个程序时,它似乎打印出了所有的组合,而不是带有有效括号的组合。我在想打印组合(前缀+”(“,open+1,close,n);将确保首先打印开头括号,然后递归调用打印组合(前缀+”),open,close+1,n)我看到一个输出带有类似)(()的内容。如果先添加(),这怎么可能呢   这是因为在堆栈上完成对打印组合(prefix+”(“,open+1,close,n)的递归调用后,您的代

我在做一个没有看答案的编码问题,我在努力寻找我的思维过程中的错误

问题是找到有效的n对括号的所有组合

当我运行这个程序时,它似乎打印出了所有的组合,而不是带有有效括号的组合。我在想
打印组合(前缀+”(“,open+1,close,n);
将确保首先打印开头括号,然后递归调用
打印组合(前缀+”),open,close+1,n)我看到一个输出带有类似
)((
)的内容。如果先添加
),这怎么可能呢


 

这是因为在堆栈上完成对
打印组合(prefix+”(“,open+1,close,n)
的递归调用后,您的代码开始重复
打印组合(prefix+”),open,close+1,n)
。这就是为什么您会得到一个以
开头的字符串输出。)
,这不是因为您进行这两个递归调用的顺序。要修复此问题,您需要有一个条件,即
close
始终小于
open
。如下所示

public class Foo{
    public void printCombinations(String prefix, int open, int close, int n){
        if (open > n) {
            return;
        }
        if (close > n) {
            return;
        }
        if (open == n && close == n){
            System.out.println(prefix);
            return;
        }
        printCombinations(prefix + "(", open + 1, close, n);
        if (close < open) {   
            printCombinations(prefix + ")", open, close + 1, n);
        }
    }
    public static void main(String []args){
        Foo w = new Foo();
        w.printCombinations("", 0, 0, 3);
    }
}
公共类Foo{
公共void打印组合(字符串前缀、int-open、int-close、int-n){
如果(打开>n){
返回;
}
如果(关闭>n){
返回;
}
如果(打开==n&&close==n){
System.out.println(前缀);
返回;
}
打印组合(前缀+“(”,打开+1,关闭,n);
如果(关闭<打开){
打印组合(前缀+“”),打开,关闭+1,n;
}
}
公共静态void main(字符串[]args){
Foo w=新的Foo();
w、 打印组合(“、0、0、3);
}
}

对不起,我意识到它看起来不好,所以我把它修好了:p
public class Foo{
    public void printCombinations(String prefix, int open, int close, int n){
        if (open > n) {
            return;
        }
        if (close > n) {
            return;
        }
        if (open == n && close == n){
            System.out.println(prefix);
            return;
        }
        printCombinations(prefix + "(", open + 1, close, n);
        if (close < open) {   
            printCombinations(prefix + ")", open, close + 1, n);
        }
    }
    public static void main(String []args){
        Foo w = new Foo();
        w.printCombinations("", 0, 0, 3);
    }
}