我是Scala和函数式编程的新手。免责声明:是的,我正在Coursera上学习Scala课程,是的,这是作业的一部分。我唯一的目标是获得一些帮助,以了解此解决方案如何工作,以便开发自己的解决方案并熟悉函数式编程。
我坚持使用递归算法的这种实现来检查括号平衡。我根本得不到:
def balance(chars: List[Char]): Boolean = {
def balanced(chars: List[Char], open: Int): Boolean = {
if (chars.isEmpty) open == 0
else
if (chars.head == '(') balanced(chars.tail,open+1)
else
if (chars.head == ')') open>0 && balanced(chars.tail,open-1)
else balanced(chars.tail,open)
}
balanced(chars,0)
}
我的第一个疑问如下。内部函数立即通过计算布尔表达式
开始if (chars.isEmpty) open == 0
我的理解(可能是错误的)是这两个表达式都将被评估:chars.isEmpty
和open==0
。
但是,参数open
似乎尚未在任何地方定义。那么为什么我不会收到错误?
其次,我根本无法得到这条线:
if (chars.head == '(') balanced(chars.tail,open+1)
评估balanced(chars.tail,open+1)
的位置以及如何评估?
假设我想检查"("
是否具有平衡括号。
if (chars.isEmpty) open == 0
将返回False,然后
if (chars.head == '(') balanced(chars.tail,open+1)
第一个表达式为TRUE,第二个表达式为? “(”没有尾巴,我再也看不到open+1
是如何工作的,因为整数open
尚未定义。我很困惑。
答案 0 :(得分:3)
你误解了一个基本的东西 - 功能定义。让我们先跳过一个程序中不重要的部分:
def balance(chars: List[Char]): Boolean = {
def balanced(chars: List[Char], open: Int): Boolean = { /* ... */ }
balanced(chars,0)
}
请注意,balance
函数的第一行只是一个函数定义 - 它是一个本地函数。一旦控制流点击balanced(chars, 0)
行,它就会调用此函数 - 因此open
变量将初始化为0
。
希望能解决您的“未初始化变量”问题。如果您还有其他问题需要评论,我会尽力帮助您。