我需要了解如何从递归函数回溯。我知道如何对阶乘或斐波那契等基本功能进行处理。对于这个问题,我不理解。
我尝试消除第二个递归调用中的其他条件,但它也会生成所有可能的括号集,包括不平衡的括号集。
public final class Example {
public static void parentheses(int left, int right, String str) {
if (left == 0 && right == 0) {
System.out.print(str);
System.out.print(", ");
}
if (left > 0) {
str += "(";
parentheses(left - 1, right, str);
}
if (right > 0 && right > left) {
str += ")";
parentheses(left, right - 1, str);
}
}
public static void main(String[] args) {
parentheses(3, 3, "");
}
}
我希望结果是所有可能的圆括号,但是在每次递归调用后,我又得到了1个左圆括号。预期输出为:
(((())),(()()),(())(),()(()),()()(),
我得到的输出是:
(((())),((()()),((()()(),(()(())),(()(()(),
答案 0 :(得分:0)
问题出在下面。
str += "(";
您每次都创建一个新的字符串对象,并将其传递给递归调用。结果,每个递归调用对字符串对象都有不同的值,因此您期望的递归失败。字符串在Java中是不可变的。
将您的代码更改为以下代码:
public static void parentheses(int left, int right, String str) {
if ( right==0 && left==0) {
System.out.print(str);
System.out.print(", ");
}
if (left > 0) {
parentheses(left-1, right, str +"(" ); // New object will be created but its value will be dereferenced from the old one and attached to the new one.
// As a result all our manipulation of string we did will be saved.
}
if ( right >0 && right > left) {
parentheses(left, right - 1, str +")" );
}
}
输入:
parentheses(3,3,""); // Function call
输出:
((())), (()()), (())(), ()(()), ()()(),