我有以下方法生成括号的所有有效打开和关闭组合:
public static void getParentheses(int openParenthesis, int closeParenthesis, String string) {
if (openParenthesis == 0 && closeParenthesis == 0) {
System.out.println(string);
}
if (openParenthesis > closeParenthesis) {
return;
}
if (openParenthesis > 0) {
System.out.println("openParenthesis: " + openParenthesis + " / closeParenthesis: " + closeParenthesis);
getParentheses(openParenthesis - 1, closeParenthesis, string + "(");
}
if (closeParenthesis > 0) {
System.out.println("openParenthesis: " + openParenthesis + " / closeParenthesis: " + closeParenthesis);
getParentheses(openParenthesis, closeParenthesis - 1, string + ")");
}
}
我用这一行称这个方法:
getParentheses(3, 3, "");
输出是:
openParenthesis: 3 / closeParenthesis: 3
openParenthesis: 2 / closeParenthesis: 3
openParenthesis: 1 / closeParenthesis: 3
openParenthesis: 0 / closeParenthesis: 3
openParenthesis: 0 / closeParenthesis: 2
openParenthesis: 0 / closeParenthesis: 1
((()))
openParenthesis: 1 / closeParenthesis: 3 //Line8
openParenthesis: 1 / closeParenthesis: 2
openParenthesis: 0 / closeParenthesis: 2
openParenthesis: 0 / closeParenthesis: 1
(()())
我不明白为什么在Line8
,openParenthesis
具有1
的价值,因为该方法的最后一次调用是与0
和0
?是什么让它增加到1
?
第3行和第8行来自相同的函数调用:第3行由
if (openParenthesis > 0) {
System.out.println("openParenthesis: " + openParenthesis + " / closeParenthesis: " + closeParenthesis);
getParentheses(openParenthesis - 1, closeParenthesis, string + "(");
}
第8行:
if (closeParenthesis > 0) {
System.out.println("openParenthesis: " + openParenthesis + " / closeParenthesis: " + closeParenthesis);
getParentheses(openParenthesis, closeParenthesis - 1, string + ")");
}
从递归调用返回后。