有人可以在下面的代码中解释递归是如何工作的吗?
目标是打印所有可能的平衡括号组合,最多为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);

答案 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;
}