Java 递归回调机制

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

我想实现一个算法来打印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(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 "()()"