0

我有以下代码(这是我的课程作业)

def balance(chars: List[Char]): Boolean = {
  def innerBalance(chars: List[Char], count: Int): Boolean = {
    if (chars.isEmpty) count == 0
    if (chars.head == '(') innerBalance(chars.tail, count+1)
    if (chars.head == ')') (count > 0) && innerBalance(chars.tail, count-1)
    innerBalance(chars.tail, count)
  }

  innerBalance(chars, 0)
} 

据我所知,这与炖菜对这种Scala 方法的回答非常相似,以编程一堆 if, 但我不知道为什么该语句

if (chars.isEmpty) count == 0

总是假的。

如果我运行这样的测试

balance("".toList)

它只是抛出异常。

谢谢你的帮助。问候,

4

3 回答 3

4

在 Scala 中,您永远不应该使用return,而应该编写表达式。上面代码的主要问题是您没有使用if表达式,即您省略了该else部分,因此编译器正在推断Unit(Java 的 void,这意味着“没有”返回)。

由于您的情况有多种选择,我建议您使用匹配表达式:

chars match {
  case '(' :: Nil => ...
  case ')' :: Nil => ...
  case Nil        => count == 0
  case _          => innerBalance(chars.tail, count)
}
于 2013-04-08T03:56:28.313 回答
2

添加到Huw 的答案中,您还可以使用模式匹配使其更优雅:

      def innerBalance(chars: List[Char], count: Int): Boolean = chars match {
          case _ if count < 0  => false
          case Nil             => count == 0
          case '(' :: rest     => innerBalance(rest, count + 1)
          case ')' :: rest     => innerBalance(rest, count - 1)
          case _ :: rest       => innerBalance(rest, count)
      }
于 2013-04-08T03:17:32.440 回答
0

像块

{
  if (a) b
  c
}

b如果是真的会做a,然后总是c。如果您只想ca为 false 时发生,您需要使用else

{
  if (a) b
  else c
}
于 2013-04-08T02:25:36.087 回答