递归生成n个括号的所有组合
输入
1
2
3
输出
()
(())
()()
((()))
(()())
(())()
()(())
()()()
思路
-
其实仔细观察生成的结果就能发现,输出的结果是能打做左括号就先打左括号,左括号打完再打右括号,这个可以反应在递归程序里
-
要说注意的点,就是传参不要传引用,每次都复制一份新的字符串,最后再打印。
code
//
// BracketPrint.cpp
// cpp
//
// Created by 风清扬 on 2021/8/19.
//
#include <stdio.h>
#include <string>
#include <iostream>
using namespace std;
void BracketPrint(int leftRem, int rightRem, string ts){
if(leftRem == 0 && rightRem == 0){ // 递归结束条件
cout << ts << endl;
return;
}
if(leftRem > 0){ // 先打印左括号
string ts1 = ts + '('; // 这里要注意,是新建一个string
BracketPrint(leftRem - 1, rightRem, ts1);
}
if(rightRem > leftRem){ // 如果能够打印右括号,有括号的触发条件不是有remian就可以随便打印的。
string ts1 = ts + ')'; // 这里同理,新建一个string
BracketPrint(leftRem, rightRem - 1, ts1);
}
}
int main(){
int n;
while(cin>>n){
string s = "";
BracketPrint(n, n, s);
}
return 0;
}