【问题标题】:Issue with tracing down the array in Java recursion function在 Java 递归函数中跟踪数组的问题
【发布时间】:2017-03-28 19:57:23
【问题描述】:

我在 Java 中遇到了递归问题。问题是这样的:

给定 n 对括号,编写一个函数来生成格式正确的括号的所有组合。

例如,给定n = 3,一个解集是:

上述问题的代码是递归的,如下所述:

public List<String> generateParenthesis(int n) {
    ArrayList<String> result = new ArrayList<String>();
    dfs(result, "", n, n);
    return result;
}

public void dfs(ArrayList<String> result, String s, int left, int right){
    if(left > right)
        return;

    if(left==0&&right==0){
        result.add(s);
        return;
    }

    if(left>0){
        dfs(result, s+"(", left-1, right);
    }

    if(right>0){
        dfs(result, s+")", left, right-1);
    }
}

我已经能够将程序跟踪到某个特定点,但我无法完全跟踪它。

如果 n=2

left=2;right=2;
result="(())", 
__________
| s=""   |
| l=2    |
| r=2    |
|        |
|        |
|________|
    |
    V
__________  
| s=(    |
| l 1    |
| r 2    |
|        |
|        |
|________|
    |
    V
__________
| s=((   |
| l 0    |
| r 2    |
|        |
|        |
|________|
    |
    V
__________
| s=(()  |
| l 0    |
| r 1    |
|        |
|        |
|________|
    |
    V
__________  
| s= (())|
| l=0    |
| r=0    |
|        |
|        |
|________|

在我上面提到的之后,该程序将如何工作?有人可以帮我追踪吗?谢谢。

【问题讨论】:

  • 使用递归吗?
  • 我不明白您所说的“tracing”是什么意思--“有人可以帮我tracing吗?”、“能够trace the program”等。Trace/Tracing通常用来表示debugging,你好像不是在说debugging。
  • 好问题..我正在学习递归..即使在解决其他问题时也有类似的疑问。想知道这里发生了什么是个好主意。谢谢
  • 我认为你可以很容易地解决这个问题,而无需使用递归。
  • Gooz,问题不在于尝试使用/不使用递归来解决问题。我试图了解递归的工作原理。这只是我正在使用的一个例子。任何帮助,将不胜感激。谢谢

标签: java string algorithm recursion


【解决方案1】:

从你离开的地方开始:

__________
| s=(    |
| l=1    |
| r=2    |
|        |
|        |
|________|
    |
    V
__________  
| s=()   |
| l 1    |
| r 1    |
|        |
|        |
|________|
    |
    V
__________
| s=()(  |
| l 0    |
| r 1    |
|        |
|        |
|________|
    |
    V
__________
| s=()() |
| l 0    |
| r 0    |
|        |
|        |
|________|

如果您使用 eclipse 或任何其他 IDE,设置断点并逐行查看程序如何运行(显示所有变量及其变化方式)应该很容易。如果你还没有学过调试,我建议你去 google 一下,学习如何调试程序。

你的程序实际上在做什么:

left (l=1, r=2)
  left (l=0, r=2)
    right (l=0, r=1)
      right (l=0, r=0)
        add result to s (l=0, r=0)
    *here you break out of 3 recursive functions and values of l,r reset to (l=1, r=2)*
  right (l=1, r=1)
    left (l=0, r=1)
      right (l=0, r=0)
      add result to s (l=0, r=0)

【讨论】:

  • 我无法评论你的帖子,因为我是这里的新用户: this 调用 right 而不是 left 的原因是因为当你中断之前的递归调用时,你已经调用了 left在那个递归调用中,它会去 (right -> left -> right) 而不是 (left -> right -> right)
  • 太棒了...非常感谢您的解释。欣赏它。
猜你喜欢
  • 2020-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-13
  • 1970-01-01
  • 2012-03-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多