2017-02-15 183 views
0

我有如下它打印的括號的所有有效組合遞歸函數:遞歸印刷平衡括號

function addParen(upstock, downstock, sa) 
{ 
    if (upstock == 0 && downstock == 0) 
    { 
     Print(sa); 
    } 

    if (upstock > 0) 
    { 
     addParen(upstock - 1, downstock + 1, sa + "("); 
    } 

    if (downstock > 0) 
    { 
     addParen(upstock, downstock - 1, sa + ")"); 
    } 
} 

它直接打印結果像串「((()))」或「( )()()「對於n = 3(我們假設3對,對數不重要)。但是,我希望我的遞歸函數每當初始空字符串連接一個「(」或「)」時,逐一打印每個圓括號。例如對於第一個組合,我希望它打印爲「(」then「(」then「 (「然後」)「」然後「)」然後「)」,然後它可以以相同的方式進行第二次組合。是否有可能做到這一點?

+0

你想等待用戶輸入嗎?你在問什麼?函數是正確的,或者你想要做什麼是「(」「(」「(」「)」「)」「)」 – Zinov

+0

不,我想要做的是當遞歸進行時,字符串是與左括號或右括號連接,我立即想要將該圓括號放在屏幕上。有了這個功能,我總是把完成的字符串放在屏幕上,只要上料和下料等於零。 –

+0

你如何期望它打印給定前綴的第二個字符串?或者你在尋找一種樹型輸出? – rici

回答

0

你不與平衡括號工作,因爲你需要做其他檢查。貝婁我將結果與組合總數進行比較。

function addParen(n, upstock, downstock, sa){ 
     var count = 0; 

     if(sa.length == 2 * n && upstock == downstock){ 
       console.log(sa); 
       //number of valid combinations 
       return 1; 
      } 

     if(upstock >= downstock && upstock <= n){ 
      count += addParen(n, upstock + 1, downstock, sa + "("); 
     } 

     if(downstock < upstock){ 
      count += addParen(n, upstock, downstock + 1, sa + ")"); 
     } 

     return count; 
    } 

function numberOfBalancedParenthesis(n){ 
    return addParen(n, 0, 0, ""); 
} 

//try this on the console 
numberOfBalancedParenthesis(2) 
+0

它仍然變得混亂。只打印第一個組合valid.I也做到了這一點,但不能成功。 –

+0

@ayt_cem我編輯了我的答案 – Zinov

+0

謝謝。它現在起作用了。它將每個元素一個接一個地打印出來嗎?不是整個字符串。 –

0

希望這是你正在尋找的!

function addParen(upstock, downstock) { 

     if (upstock > 0) 
     { 
      Print("("); 
      addParen(upstock - 1, downstock+1); 
     } 

     if (downstock > 0) 
     { 
      Print(")"); 
      addParen(upstock, downstock - 1); 
     } 

} 
+0

不幸的是,它並沒有正確顯示所有的結果。 –