【问题标题】:Scala List[Char] is empty but does not return trueScala List[Char] 为空但不返回 true
【发布时间】:2013-04-08 11:56:28
【问题描述】:

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

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 way to program bunch of if's 上的回答非常相似 但我不知道为什么声明

if (chars.isEmpty) count == 0

永远是假的。

如果我运行这样的测试

balance("".toList)

它只是抛出异常。

感谢您的帮助。 问候,

【问题讨论】:

  • 这不是 scala 的惯用用法。我建议使用 match 来减少解决方案的冗长和复杂性。

标签: scala recursion


【解决方案1】:

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

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

chars match {
  case '(' :: Nil => ...
  case ')' :: Nil => ...
  case Nil        => count == 0
  case _          => innerBalance(chars.tail, count)
}

【讨论】:

    【解决方案2】:

    添加到Huw's answer,还可以使用模式匹配,让它更优雅:

          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)
          }
    

    【讨论】:

    • 他们实际上不能(模式匹配将在这个 Scala 课程作业之后的下周引入)。
    • 没有规定禁止使用未涵盖的东西。
    【解决方案3】:

    块状

    {
      if (a) b
      c
    }
    

    如果a 为真,将执行b,然后总是执行c。如果您希望c 仅在a 为假时发生,则需要使用else

    {
      if (a) b
      else c
    }
    

    【讨论】:

    • 谢谢,这有帮助。我需要为我的每个语句显式添加“return”关键字。发布问题后才意识到我的问题。
    猜你喜欢
    • 2022-09-28
    • 2013-02-23
    • 1970-01-01
    • 1970-01-01
    • 2019-12-09
    • 2016-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多