即使使用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
答案 0 :(得分:2)
您创建了一个无效的独立表达式。
if (depth < 0)
false
这将被评估为AnyVal
(因为没有其他分支),然后被丢弃。 balanceR
未返回此处。您可能意味着第二个if
分支是else if
。