【问题标题】:Recursion Printing Balanced Parantheses递归打印平衡括号
【发布时间】:2017-02-15 18:52:24
【问题描述】:

我有一个递归函数,它打印出所有有效的平衡括号组合,如下所示:

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 ")" and then ")"。那么第二个组合可以用同样的方法进行。可以吗?

【问题讨论】:

  • 您要等待用户输入吗?这就是你要问的吗?函数是正确的,或者你想要做什么是"(" "(" "(" ")" ")" ")"
  • 不,我想做的是在递归进行并且字符串与左括号或右括号连接时,我立即想将该括号放在屏幕上。使用该功能,只要 upstock 和 downstock 等于 0,我总是将完成的字符串显示在屏幕上。
  • 你希望它如何打印带有给定前缀的第二个字符串?还是您在寻找树形输出?
  • 当输入太大时我问这个的原因我想在程序完成其余部分时在屏幕上看到结果组合。
  • 但是您的程序在找到每个字符串时将其打印出来;它不需要等待计算所有字符串。那么您观察到什么问题?

标签: javascript algorithm recursion printing output


【解决方案1】:

你的不使用平衡括号,因为你需要进行另一次检查。下面我将结果与组合总数结合起来。

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)

【讨论】:

  • 它仍然很乱。只打印第一个有效的组合。我也这样做了,但没有成功。
  • 谢谢。它现在可以工作了。它会一一打印每个元素吗?不是一个完整的字符串。
  • 实际上是一个一个,找到正确的字符串后,但它适用于所有现有的组合,如果答案对您有用,请将其标记为已解决
  • 它有效,我将其标记为已解决。为什么我想问这个?因为当输入 n 太大时,我想开始在屏幕上看到结果组合,而程序仍然执行其余的组合。但是我做不到。
  • 我认为您混淆了您想要解决的问题和浏览器行为的想法。您想在浏览器计算其余部分时查看组合,但这是另一个问题,在 javascript 上没有睡眠功能,最接近的是使用此功能 setTimeout 设置超时等待。
【解决方案2】:

希望这就是你要找的东西!

function addParen( upstock, downstock ) {

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

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

} 

【讨论】:

  • 不幸的是它没有正确显示所有结果。
猜你喜欢
  • 2013-11-18
  • 2012-09-15
  • 2015-10-18
  • 2011-02-12
  • 1970-01-01
  • 1970-01-01
  • 2015-04-04
  • 2019-10-22
  • 1970-01-01
相关资源
最近更新 更多