Scala中的括号平衡

时间:2013-09-22 06:14:32

标签: 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 - 1
      else numOpens
    if (n >= 0) balance(chars.tail, n)
    else false
  }
}

2 个答案:

答案 0 :(得分:3)

行:

if (n >= 0) balance(chars.tail, n)
else false

表示如果在任何时候存在任何不平衡的)字符,则会立即返回false(n将为< 0)。对于您给出的具体示例:())(我们可以通过字符串来跟踪n的值如何变化:

  • 第一个字符 - (:n - > 1,继续使用剩余字符进行检查:))(
  • 第二个字符 - ):n - > 0,继续使用剩余字符进行检查:)(
  • 第三个字符 - ):n - > -1,else已触发 - 立即返回false。永远不会检查第四个字符。

答案 1 :(得分:3)

Shadowlandsanswer是正确的,但我希望你会发现这更具说明性:

让我们想象一下,我们在无限楼梯的最高楼梯上。并且有一条说明:(表示step down),)表示step up),您应该忽略所有其他说明

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)

示例:

())(表示↓↑↑↓。在此部分↓↑之后,您将位于顶部上层楼梯,因此您无法在下一个命令()(n < 0)之后进行升级,因此该指令无效。