Scala 括号平衡算法

Scala 括号平衡算法,scala,functional-programming,Scala,Functional Programming,我正在使用scala中的一个小程序来检查某些表达式是否正确地形成了关于括号的开始和结束。这只是我自己的程序的问题 def balance(chars: List[Char]): Boolean = { def balanced(chars: List[Char], opened: Int, closed: Int): Boolean = { if (chars.isEmpty && opened == closed) true else if (opened &l

我正在使用scala中的一个小程序来检查某些表达式是否正确地形成了关于括号的开始和结束。这只是我自己的程序的问题

def balance(chars: List[Char]): Boolean = {
  def balanced(chars: List[Char], opened: Int, closed: Int): Boolean = {
   if (chars.isEmpty && opened == closed) true
   else if (opened < closed) false
   else {
    if (chars.head == '(') balanced(chars.tail, opened + 1, closed)
    if (chars.head == ')') balanced(chars.tail, opened, closed + 1)
    else balanced(chars.tail, opened, closed)
   }
 }
  balanced(chars, 0, 0)
def余额(字符:列表[Char]):布尔={
def平衡(字符:列表[Char],打开:Int,关闭:Int):布尔={
如果(chars.isEmpty&&opened==closed)为true
否则,如果(打开<关闭)错误
否则{
如果(chars.head=='(')平衡(chars.tail,打开+1,关闭)
如果(chars.head=='))平衡(chars.tail,打开,关闭+1)
else平衡(字符尾、打开、关闭)
}
}
平衡(字符,0,0)
}

println(balance(“只是(一些(随机的)句子)。\n(那不起作用)”.toList))


问题是,例如,它不适用于此示例。我跟踪了程序,很明显,当我们从递归调用返回时,问题就出现了,但我无法确定错误是什么。

您可以尝试下面的代码,可能是上面示例中的代码,如果您有“sss)fff(“它也给出了真值,所以逻辑上是错误的

def balance(chars: List[Char]): Boolean = {
    def balrec(chars: List[Char], accr: Int, accl: Int): Boolean = {
      chars match {
        case head :: tail =>
          if (head.equals('(')) balrec(tail, accr + 1, accl)
          else if (head.equals(')') && (accr > accl || accr == 0)) balrec(tail, accr, accl + 1)
          else balrec(tail, accr, accl)
        case Nil => if (accr == accl) true else false
      }
    }

    balrec(chars, 0, 0)
  }

您可以尝试下面的代码可能是它的工作为您在上面的例子中也有问题,如果你有“sss)fff(“它也给真的,所以它将在逻辑上错误

def balance(chars: List[Char]): Boolean = {
    def balrec(chars: List[Char], accr: Int, accl: Int): Boolean = {
      chars match {
        case head :: tail =>
          if (head.equals('(')) balrec(tail, accr + 1, accl)
          else if (head.equals(')') && (accr > accl || accr == 0)) balrec(tail, accr, accl + 1)
          else balrec(tail, accr, accl)
        case Nil => if (accr == accl) true else false
      }
    }

    balrec(chars, 0, 0)
  }

如果要将两个独立的
if
表达式视为一个大小写表达式,则需要使用两个独立的
if
表达式。if
chars.head=='(“
true
进行递归调用,但结果被忽略,第二个
if
被计算。这将导致执行
else
分支,该分支实际上忽略了第一个表达式中的
。您可以使用
匹配
,例如

chars match {
  case Nil => opened == closed
  case '('::cs => balanced(cs, opened + 1, closed)
  case ')'::cs => balanced(cs, opened, closed + 1)
  case _::cs => balanced(cs, opened, closed)
}

如果要将两个独立的
if
表达式视为一个大小写表达式,则需要使用两个独立的
if
表达式。if
chars.head=='(“
true
进行递归调用,但结果被忽略,第二个
if
被计算。这将导致执行
else
分支,该分支实际上忽略了第一个表达式中的
。您可以使用
匹配
,例如

chars match {
  case Nil => opened == closed
  case '('::cs => balanced(cs, opened + 1, closed)
  case ')'::cs => balanced(cs, opened, closed + 1)
  case _::cs => balanced(cs, opened, closed)
}


你说的“不工作”是什么意思?你有输出吗?@泽明尔:是的,对于PrtLn语句,它应该返回true,但是它实际上返回了错误,你也可以考虑使用组合分析器(例如ATTO)。对于这类问题,尽管这有点过头了。@Reactormonk,有点过头了,是的。这是一个Coursera课程练习……如果这是Scala函数编程原理第1周的家庭作业(测试字符串强烈建议是这样的),这违反了Coursera的荣誉代码。你对它到底是什么意思“不工作”?你有输出吗?@泽明尔:是的,对于PrtLLN语句,它应该返回true,但是它实际上返回了错误,你也可以考虑使用组合分析器(例如ATTO)。对于这类问题,尽管这有点过头了。@Reactormonk,有点过头了,是的。这是一个Coursera课程练习……如果这是Scala函数编程原理第1周的家庭作业(测试字符串强烈建议是这样的话),这违反了Coursera的荣誉准则。这是一个!它也可以通过使用else-if而不是第二个if来解决。谢谢这是一个!它也可以通过使用else-if而不是第二个if来解决。谢谢给出完全不同的准则没有什么意义,即使它有效。OP提供了一个带有工作示例的问题链接le.这是一个关于他们的代码出了什么问题的问题,不是要求另一个解决方案的问题。@TheArchetypalPaul不是另一个解决方案它与lee回答中提到的相同它不在同一个匹配案例中,所以我将它放在同一个匹配案例中并给出整体解决方案不,它完全不同。参数名称已更改,案例语句严重或错误组织起来,测试的顺序是不同的。@TheArchetypalPaul很抱歉,但当我试图解决某个问题时,我不能复制同样的变量名,我只是在我的REPL上尝试它,我把名字记在心里,它“一样”只是因为它是解决问题的递归函数。在几乎所有其他方面,它都不同。它还认为“()"是平衡的,所以它甚至不正确。给出完全不同的代码,即使它有效,也没有什么意义。OP提供了一个链接,指向一个带有工作示例的问题。这是一个关于他们的代码有什么问题的问题,而不是要求另一个解决方案。@TheArchetypalPaul这不是另一个解决方案,它与lee中提到的答案相同s不在同一个匹配案例中,因此我将其放在同一个案例中,并给出整体解决方案不,它完全不同。参数名称已更改,案例语句组织不当,测试顺序不同。@TheArchetypalPaul抱歉,但当我尝试解决某个问题时,我无法复制同样的变量名称,我只是在我的REPL上尝试,然后将其放在nam上在我看来,它是“一样”的,只是因为它是一个解决问题的递归函数。在几乎所有其他方面,它都是不同的。它还认为“)()”是平衡的,所以它甚至不正确。