【发布时间】:2019-10-22 03:54:22
【问题描述】:
我需要了解如何从递归函数中回溯。我知道对于阶乘或斐波那契等基本函数是如何完成的。这个问题我不明白。
我尝试在第二个递归调用中消除其他条件,但它也会生成所有可能的括号集,包括不平衡的括号集。
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 个额外的左括号。预期输出是:
((())), (()()), (())(), ()(()), ()()(),
我得到的输出是:
((())), ((()()), ((()()(), (()(()), (()(()(),
【问题讨论】:
-
回溯和递归调用是有区别的。递归不是回溯。
-
如果你使用递归,你所说的回溯不是回溯。您正在考虑的是“提前返回”:一旦您获得“期望的结果”或“已知永远不会产生期望的结果”,您就会返回。在代码注释中:不要传入
str,使函数returnstr,然后在运行时聚合这些返回值。在一个为 0 另一个为 1 之前不要返回任何内容,然后返回适当的字符串,然后 在递归步骤之后,组装成您返回的更大的字符串。 -
看不到输入是什么...
标签: java recursion backtracking parentheses