You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 23:12:22