現在給出一個偶數
n
,要求打印出所有的括號的組合,括號有兩種,分別是(
和)
要求: 左括號右邊一定得有一右括號和它對應,右括號的左邊也一定有一個左括號對應,舉個例子,當n=2
的時候,只有()
這種情況,)(
這種情況是不可行的。
這個問題聽起來其實有點類似于給你一個數,比如10,然后打印出所有的二進制的可能性。
分析
那么,拿到手后,首先是進行簡單的分析,有左括號,一定有一個右括號對應,而且必須是一對對的,那么可以有以下結論:
- 任意一個位置的左側的左括號的數量 大于等于 右括號的數量(第一個位置那么就肯定是左括號了)
- 任意一個位置的左側,左括號的數量 小于等于
n/2
那么就可以通過這兩點來進行遞歸的判斷,代碼如下:
function getSynbols(number, sumOnly, left, right, str, arr) {
arr = arr == undefined ? (sumOnly ? [0] : []) : arr;
left = left || 0;
right = right || 0;
str = str || '';
let half = number / 2;
if (right + left == number) {
if (sumOnly) {
arr[0]++;
} else {
arr.push(str);
}
} else {
if (number % 2 == 0) {
if (left < half) {
getSynbols(number, sumOnly, left + 1, right, str + "(", arr);
if (left > 0 && right < left) getSynbols(number, sumOnly, left, right + 1, str + ")", arr);
} else {
getSynbols(number, sumOnly, left, right + 1, str + ")", arr);
}
} else {
console.log("請輸入一個偶數");
}
}
return arr;
};
這里的參數說明如下:
- number 表示輸入的數,這個數字必須是偶數。
- sumOnly 表示是否只統計數量,而不將結果存儲到數組中(防止數量太大,撐爆內存)
- left 表示左括號的數量
- right 表示右括號的數量
- str 表示當前的已經拼接的字符串
- arr 存放結果的數組