【发布时间】:2017-07-02 16:28:40
【问题描述】:
我是 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 尚未在任何地方定义。我很困惑。
【问题讨论】:
-
你说
open没有定义是什么意思?它是函数的参数之一。 -
是,但没有为其分配任何值。如果 open 到目前为止没有任何价值,我怎么知道 open == 0?
-
按照同样的逻辑,您可能会争辩说您不知道
chars的值是什么。在调用函数之前,不会评估函数的主体。一旦发生这种情况,你就知道争论是什么了。