1

我正在尝试学习 scala 并正在做作业,但无法弄清楚以下内容......

所以,问题是递归地确定括号是否平衡......递归地。所以这是我的一个工作解决方案..

 def balance(chars: List[Char]): Boolean = {
    def iterate(chars: List[Char], sum:Int):Int = {
       if(chars.isEmpty ||  sum<0) sum 
       else if(chars.head == '(') iterate(chars.tail ,sum+1)
       else if(chars.head == ')') iterate(chars.tail,sum-1)
       else iterate(chars.tail, sum)

    }
    iterate(chars,0) == 0
  }

但是如果将我的代码更改为以下

 def balance(chars: List[Char]): Boolean = {
    def iterate(chars: List[Char], sum:Int):Int = {
       if(chars.isEmpty ||  sum<0) sum 
       else if(chars.head == "(") iterate(chars.tail ,sum+1) //NOTE double quotes 
       else if(chars.head == ")") iterate(chars.tail,sum-1) //NOTE double quotes
       else iterate(chars.tail, sum)

    }
    iterate(chars,0) == 0
  }

这总是返回真......

为什么?

//test with 
val s1 = ":-)"
println(balance(s1.toList))
4

2 回答 2

5

chars.head 是一个 Char,'(' 是一个 Char,但是 "(" 是一个 String,所以这两个分支总是会评估为 false

else if(chars.head == "(") iterate(chars.tail ,sum+1) //NOTE double quotes 
else if(chars.head == ")") iterate(chars.tail,sum-1) //NOTE double quotes
于 2013-10-20T01:36:38.280 回答
1

使用 match,你会看到一个错误:

<console>:11: error: type mismatch;
 found   : String("(")
 required: Char
               case "(" => loop(cs.tail, sum + 1)
                    ^

使用更正后的代码:

def balance(cs: Seq[Char]) = {
  def loop(cs: Seq[Char], sum: Int): Int = {
    if (cs.isEmpty || sum < 0) sum
    else {
      val i = cs.head match {
        case '(' => 1
        case ')' => -1
        case _   => 0
      }
      loop(cs.tail, sum + i)
    }
  }
  loop(cs, 0) == 0
}
于 2013-10-20T07:21:26.350 回答