生成所有平衡支架组合

时间:2017-09-27 18:15:25

标签: javascript recursion

有人可以在下面的代码中解释递归是如何工作的吗?

目标是打印所有可能的平衡括号组合,最多为N.例如:

N = 2: (()), ()()
N = 3: ((())), (()()), (())(), ()(()), ()()()

我不知道这段代码是如何工作的,它给出了所有可能的平衡括号组合,如果((()))只提供n=3那么?



var all = [];

function parens(left, right, str) {

  // if no more brackets can be added then add the final balanced string
  if (left === 0 && right === 0) {
    all.push(str);
  }

  // if we have a left bracket left we add it
  if (left > 0) {
    parens(left - 1, right + 1, str + "(");
  }

  // if we have a right bracket left we add it
  if (right > 0) {
    parens(left, right - 1, str + ")");
  }

}


parens(3, 0, "");
console.log(all);




2 个答案:

答案 0 :(得分:1)

您可以使用所有参数检查函数的调用,并将级别作为调用协议的缩进。

相同级别表示同一函数调用的不同调用。

left right string

3 0 
    2 1 (
        1 2 ((
            0 3 (((
                0 2 ((()
                    0 1 ((())
                        0 0 ((()))  push to result
            1 1 (()
                0 2 (()(
                    0 1 (()()
                        0 0 (()())  push to result
                1 0 (())
                    0 1 (())(
                        0 0 (())()  push to result
        2 0 ()
            1 1 ()(
                0 2 ()((
                    0 1 ()(()
                        0 0 ()(())  push to result
                1 0 ()()
                    0 1 ()()(
                        0 0 ()()()  push to result

答案 1 :(得分:0)

#include<iostream>
using namespace std;
void parenthesis(int open, int close, string brak)
{
   if (open == 0 && close == 0)
      cout<<brak;
   if (open>close)
      return;
   if (open > 0)
      parenthesis(open-1, close,brak + "(");
   if (close > 0)
      parenthesis(open, close - 1,brak + ")");
}
void printPar(int n)
{
   parenthesis(n,n,"\n");
}
int main()
{
   int n=1;
   printPar(n);
   return  0;

}