递归回调机制

时间:2018-08-24 16:36:49

标签: 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     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会失败),但是我在调​​用堆栈中有什么?

如果我能理解的话,我可以回到源电话。谢谢!

1 个答案:

答案 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 "()()"