我想实现一种算法,以打印n对括号的所有有效(例如正确打开和关闭)组合。
示例:
输入:2(例如2对括号)输出:()(),(())
算法工作正常:
1 public static void f(int l, int r, char[] str, int count) {
2 if (l < 0 || r < l) return;
3 if (l == 0 && r == 0) {
4 System.out.println(str);
5 } else {
6 if (l > 0) {
7 str[count] = ‘(‘;
8 f(l - 1, r, str, count + 1);
9 }
10 if (r > l) {
11 str[count] = ‘)’;
12 f(l, r - 1, str, count + 1);
13 }
14 }
15 }
我使用f(count,count,str,0);进行调用,在我们的示例中假设f(2,2,“”,0)
问题:我是编程的新手,我不理解递归过程中的回调机制。
要逐步详细说明:
f(2,2,"",0)
-> str = "(" -> f(1,2,"(",1)
-> str = "((" -> f(0,2,"((",2)
-> str = "(()" -> f(0,1,"(()",3)
-> str = "(())" -> f(0,0,"(())",4)
-> print "(())" !
在这一点上,我感到困惑。因此,在调用f(0,0,“(())”,4)之后,我要进行上一个调用。我到达f(0,1,“(()”,3)内的第15行。 这是缺口,这里会发生什么?我应该在这里尝试插入“(”(由于l == 0会失败),但是我在调用堆栈中有什么?
如果我能理解的话,我可以回到源电话。谢谢!
答案 0 :(得分:0)
函数完成后,它将返回到最初被调用的位置。因此,到达f(0,1,"(()",3)
的第15行后,程序将在f(0,2,"((",2)
的第13行继续。如果要在每个函数调用的开始时打印参数,则会得到以下内容:
f(2, 2, "", 0)
f(1, 2, "(", 1)
f(0, 2, "((", 2)
f(0, 1, "(()", 3)
f(0, 0, "(())", 4) <-- print "(())"
f(1, 1, "()", 2)
f(0, 1, "()(", 3)
f(0, 0, "()()", 4) <-- print "()()"