这是我的问题:我不明白代码是如何工作的。
"())("
如何返回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
}
}
答案 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)
Shadowlands的answer是正确的,但我希望你会发现这更具说明性:
让我们想象一下,我们在无限楼梯的最高楼梯上。并且有一条说明:(
表示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
)之后进行升级,因此该指令无效。