Java 递归回调机制
我想实现一个算法来打印n对括号的所有有效(例如,正确打开和关闭)组合 例如: 输入:2(例如,2对括号)输出:(),(()) 该算法运行良好:Java 递归回调机制,java,recursion,callback,Java,Recursion,Callback,我想实现一个算法来打印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
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(0,0,“(())”,4)之后,我转到上一个调用。我到达f(0,1,(())3)内的第15行。
这里是间隙,这里发生了什么?我应该尝试在这里插入“((由于l==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 "()()"
f(2,2,”,0)
f(1,2,“(”,1)
f(0,2,(,2)
f(0,1,“(()”,3)
f(0,0,“(())”,4)我不太理解你的问题。你不应该在那一点上插入“(”,因为你没有“(”。你将遍历回调用堆栈,直到计数再次为1
,你将尝试在其中追加“)”,而不是“(”。你如何翻译技术细节”因为你没有“(”左“您已经在代码中翻译了它:if(l>0)
。
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 "()()"