为什么我的功能通过移动一些逻辑而改变?

时间:2017-01-12 18:22:47

标签: scala

即使使用assert(!balance("())(".toList))

,此行为也符合预期
def balance(chars: List[Char]): Boolean = {
  def balanceR(chars: List[Char], depth: Int): Boolean = {
    if (chars.isEmpty)
      depth == 0

    else if (chars.head == '(') balanceR(chars.tail, depth + 1)
    else if (chars.head == ')') {
      if (depth == 0) false else balanceR(chars.tail, depth - 1)
    }
    else balanceR(chars.tail, depth)
  }
  balanceR(chars, 0)
}

但是,将逻辑位置修改为“如果深度变为负值则返回false”会导致相同的断言失败:

def balance(chars: List[Char]): Boolean = {
  def balanceR(chars: List[Char], depth: Int): Boolean = {
    if (depth < 0)
      false

    if (chars.isEmpty)
      depth == 0

    else if (chars.head == '(') balanceR(chars.tail, depth + 1)
    else if (chars.head == ')') balanceR(chars.tail, depth - 1)
    else balanceR(chars.tail, depth)
  }
  balanceR(chars, 0)
}

"())("chars.head的递归调用应为")"时,为什么第二个函数不会为balanceR("(", -1)返回false?

请注意,这是来自Scala Coursera,并在此处查看关于该主题的mod评论:Scala way to program bunch of if's

1 个答案:

答案 0 :(得分:2)

您创建了一个无效的独立表达式。

if (depth < 0)
  false

这将被评估为AnyVal(因为没有其他分支),然后被丢弃。 balanceR未返回此处。您可能意味着第二个if分支是else if