Scala中的括号平衡

Scala中的括号平衡,scala,Scala,我的问题是:我不明白代码是如何工作的。 “())(“如何返回false def balance(chars: List[Char], numOpens: Int): Boolean = { if (chars.isEmpty) { numOpens == 0 } else { val h = chars.head val n = if (h == '(') numOpens + 1 else if (h == ')') numOpens -

我的问题是:我不明白代码是如何工作的。
“())(“
如何返回
false

def balance(chars: List[Char], numOpens: Int): Boolean = {
  if (chars.isEmpty) {
    numOpens == 0
  } else {
    val h = chars.head
    val n =
      if (h == '(') numOpens + 1
      else if (h == ')') numOpens - 1
      else numOpens
    if (n >= 0) balance(chars.tail, n)
    else false
  }
}
台词:

if (n >= 0) balance(chars.tail, n)
else false
这意味着,如果在任何一点上存在任何不平衡的
字符,将立即返回
false
(n将<0)。对于您给出的特定示例:
())(
我们可以了解函数通过字符串工作时n值的变化:

  • 第一个字符-
    :n->1,使用剩余字符继续检查:
    )(
  • 第二个字符-
    :n->0,使用剩余字符继续检查:
    )(
  • 第三个字符-
    :n->-1,
    其他
    已触发-立即返回
    。第四个字符永远不会被选中
    • 的说法是正确的,但我希望您会发现这一点更具说明性:

      让我们想象一下,我们在无限楼梯的最上面的楼梯上。还有一条指令:
      表示
      下一步
      ),
      表示
      向上提升(
      ),您应该忽略所有其他说明

      val n =
        if (h == '(') numOpens + 1 // step down
        else if (h == ')') numOpens - 1 // step up
        else numOpens // ignore
      
      走完最后一步,我们必须站在最上面的楼梯上。否则指令无效

      if (chars.isEmpty) {
        numOpens == 0
      } else { ... }
      
      if (n >= 0) ...
      else false // there is no stairs upper than the upper one (0)
      
      您不能从最上面的楼梯向上走,否则说明无效

      if (chars.isEmpty) {
        numOpens == 0
      } else { ... }
      
      if (n >= 0) ...
      else false // there is no stairs upper than the upper one (0)
      
      例如:

      表示
      ↓↑↑↓。在此部分之后
      ↓↑您将在最上面的楼梯上,因此在下一个命令(
      )(
      n<0
      ),因此该指令无效

      if (chars.isEmpty) {
        numOpens == 0
      } else { ... }
      
      if (n >= 0) ...
      else false // there is no stairs upper than the upper one (0)