0

括弧のバランスをとる関数を作成しましたが、いくつかの問題が発生しました

def subfunc(left: Int, chars: List[Char]): Boolean = {
  if (chars.isEmpty) {
    if (left == 0) { println("true"); true }
    else false
  **} else {**
    if (chars.head == '(') subfunc(left + 1, chars.tail)
    else if (chars.head == ')') {
      if (left > 0) subfunc(left - 1, chars.tail)
      else false
    } else
      subfunc(left, chars.tail)
  }
}

func がこのような場合、パフォーマンスは問題ありませんが、} else {を rm すると 、コードは次のようになります。

  def subfunc(left: Int, chars: List[Char]): Boolean = {
    if (chars.isEmpty) {
      if (left == 0) { println("true"); true }
      else false
    }
    println("come to here")
    if (chars.head == '(') subfunc(left + 1, chars.tail)
    else if (chars.head == ')') {
      if (left > 0) subfunc(left - 1, chars.tail)
      else false
    } else
      subfunc(left, chars.tail)
  }  

そしてテストクラッシュ

  subfunc(0, chars)                               //> come to here?
                                                  //| come to here?
                                                  //| come to here?
                                                  //| come to here?
                                                  //| come to here?
                                                  //| true
                                                  //| come to here?
                                                  //| 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.expriment$$anonfun$main$1.subfunc$1(recfun.expriment.scala:22)
                                                  //| 
                                                  //|   at recfun.expriment$$anonfun$main$1.apply$mcV$sp(recfun.expriment.scala:
                                                  //| 35)
                                                  //|   at org.scalaide.worksheet.runtime.library.WorksheetSupport$$anonfun$$exe
                                                  //| cute$1.apply$mcV$sp(WorksheetSupport.scala:76)
                                                  //|   at org.scalaide.worksheet.runtime.library.WorksheetSupport$.redirected(W
                                                  //| orksheetSupport.scala:65)
                                                  //|   at org.scalaide.worksheet.runtime.library.WorksheetSupport$.$execute(Wor
                                                  //| ksheetSupport.scala:75)
                                                  //|   at recfun.expriment$.main(recfun.expriment.scala:3)
                                                  //|   at recfun.expriment.main(recfun.expriment.scala)

プログラムは subfunc(0, emptylist) に来るようですが、行の後に「ここに来てください」と出力するのはなぜですか

if (left == 0) { println("true"); true}

実行されますか?

4

1 に答える 1