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'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)
      }
于 2013-04-08T03:17:32.440 に答える