我写了一个递归括号平衡函数,但似乎代码中没有任何错误,但是当我运行它时会出现很多错误。
我用这样的调用编写了这个函数:
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)
我该如何解决? 对任何noobness抱歉,我是Scala的新手。
我尝试用这个替换我的递归调用:
if (chars.isEmpty: Boolean) {
if (stack == 0) true else false
}
else
recursbalance(chars.tail: List[Char], stack: Int)
但我仍然遇到了所有错误..
答案 0 :(得分:3)
在致电List
之前,您需要检查head
是否为空,match
可能是执行此操作的最佳方式:
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
答案 1 :(得分: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)
}
使用列表重复调用recursbalance,该列表比前一个列素短一个元素。所以在某些时候列表是空的,你试图从空列表中取出head元素。那是你得到java.util.NoSuchElementException。
您的代码中还有其他一些要指出的事项。例如,您在if条件中将Char与List [Char](Chars列表)进行比较。这总是评估为假。