Scala实现括号平衡判断函数时if条件始终不执行问题
问题根因
边界判断语句被判定为死代码、始终不生效,核心原因是Scala语法规则和常见命令式语言存在差异:
- 你写的
if (chars.isEmpty) l==r是孤立表达式:没有配套else分支,也没有将表达式的计算结果作为返回值、或者绑定到变量,执行完这行判断后,无论chars.isEmpty是true还是false,程序都会直接往下执行val c = chars.head的逻辑。 - 当递归到字符列表为空时,这行if判断算出
l==r的结果后会直接丢弃该值,继续尝试取空列表的head,直接抛出NoSuchElementException,根本不会在这里返回判断结果。IDE正是检测到这个分支的计算结果完全不影响代码执行路径、就算条件命中也不会终止流程,才会把它标记为永远不会生效的死代码。
修复方法
把边界判断和后续的字符匹配逻辑整合成完整的if-else表达式,让这个表达式作为辅助函数的返回表达式:空列表时直接返回左右括号计数相等的结果,非空时才取队首字符做匹配递归。
修复后的可运行代码:
def balance(chars: List[Char]): Boolean = { def butil(chars: List[Char], l: Int, r: Int): Boolean ={ if (chars.isEmpty) { l == r } else { chars.head match { case '(' => butil(chars.tail, l+1, r) case ')' => if(l <= r) false else butil(chars.tail, l, r+1) case _ => butil(chars.tail, l, r) } } } butil(chars, 0, 0) }
额外说明
原代码里单独定义ret变量再返回的写法是多余的,Scala会自动返回代码块最后一个表达式的计算结果,不需要额外定义中间变量承接。
内容的提问来源于stack exchange,提问作者awadhesh14
相关产品推荐
相关产品推荐

