2017-02-15 19 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 ») ("then") "then") ", а затем") ". Тогда он может действовать одинаково для второй комбинации. Возможно ли это сделать?

+0

Вы хотите подождать входа пользователя? это то, что вы спрашиваете? («" ("") "") "") " – Zinov

+0

Нет, то, что я хочу сделать, пока рекурсия продолжается, а строка - конкатенированный левой или правой скобкой, я сразу же хочу поставить эту скобку на экран. С помощью этой функции я всегда помещаю завершенную строку на экран всякий раз, когда подставка и нижний уровень равны нулю. –

+0

Как вы ожидаете, что он напечатает вторую строку с заданным префиксом? Или вы ищете выход из дерева? – rici

ответ

0

Ваш не работает со сбалансированной круглой скобкой, потому что вам нужно сделать еще одну проверку. Bellow Я помещаю результат с общим количеством комбинаций.

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

К сожалению, он не отображает все результаты правильно. –