3

再帰的な括弧のバランスをとる関数を書きましたが、コードにエラーはないようですが、実行すると多くのエラーが発生します。

私はこのような呼び出しで関数を書きました:

if(balance("blarg(arg)".toList)) println("true!") else println("false")

および次のような定義:

def balance(chars: List[Char]): Boolean ={

      implicit class MutableInt(var value: Int) 
      {
          def inc() = { value+=1 } 
          def dec() = { value-=1 }                  
      }

        var stack: Int = 0

        def recursbalance(chars: List[Char], stack: Int): Boolean=
        {

            if ((chars.head: Char) == "(".toList) stack.inc()
            else if ((chars.head: Char) == ")".toList) stack.dec()

            if (stack<0) false

            if (chars.isEmpty: Boolean) if (stack == 0) true else false  

            recursbalance(chars.tail: List[Char], stack: Int)

        }
    recursbalance(chars: List[Char], stack: Int)
}

次のエラーが表示されます。

Exception in thread "main" java.util.NoSuchElementException: head of empty list
at scala.collection.immutable.Nil$.head(List.scala:337)
at scala.collection.immutable.Nil$.head(List.scala:334)
at recfun.Main$.recursbalance$1(Main.scala:45)
at recfun.Main$.balance(Main.scala:55)
at recfun.Main$.main(Main.scala:16)
at recfun.Main.main(Main.scala)

どうすれば修正できますか? 初心者で申し訳ありません。私は Scala を初めて使用します。

再帰呼び出しをこれに置き換えてみました:

   if (chars.isEmpty: Boolean) {
       if (stack == 0) true else false  
   }
   else
       recursbalance(chars.tail: List[Char], stack: Int) 

しかし、私はまだすべてのエラーを取得しています..

4

2 に答える 2

3

を呼び出す前に、Listが空かどうかを確認する必要があります。おそらくこれが最善の方法です。headmatch

  def balance(chars: List[Char]) = {

    def recursbalance(chars: List[Char], stack: Int): Int = chars match {
      case Nil => stack
      case ')' :: tail => recursbalance(tail, stack - 1)
      case '(' :: tail => recursbalance(tail, stack + 1)
      case x :: tail => recursbalance(tail, stack)
    }
    recursbalance(chars, 0) == 0;
  }

メソッドを少し変更して、を削除し、内部で直接MutableInt使用しました。Int

簡単なチェックを実行しました:

  println(balance("())".toList));
  println(balance("(())".toList));

出力

false
true
于 2013-03-29T16:43:05.100 に答える
0

コード内の特定のエラーは実行時エラーです。Scala コンパイラは、コンパイル時に失敗することを検出できません。そのため、コードは IDE で正常に表示されます。ただし、実行するとエラーが発生します。それは次の行に由来します。

def recursbalance(chars: List[Char], stack: Int): Boolean=
{
  if ((chars.head: Char) == "(".toList) stack.inc()

  // ... 

  recursbalance(chars.tail: List[Char], stack: Int)
}

前のリストよりも 1 要素短いリストを使用して recursbalance を繰り返し呼び出します。したがって、ある時点でリストが空になり、空のリストから head 要素を取得しようとします。そのとき、java.util.NoSuchElementException が発生します。

コードで指摘すべきことが他にもいくつかあります。たとえば、if 条件で Char を List[Char] (Char のリスト) と比較しています。これは常に false と評価されます。

于 2013-03-29T16:51:45.660 に答える