试图理解Scala

时间:2017-07-02 16:28:40

标签: scala recursion

我是Scala和函数式编程的新手。免责声明:是的,我正在Coursera上学习Scala课程,是的,这是作业的一部分。我唯一的目标是获得一些帮助,以了解此解决方案如何工作,以便开发自己的解决方案并熟悉函数式编程。

我坚持使用递归算法的这种实现来检查括号平衡。我根本得不到:

  1. 功能的结构
  2. 如何评估布尔表达式
  3. 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.isEmptyopen==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尚未定义。我很困惑。

1 个答案:

答案 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

希望能解决您的“未初始化变量”问题。如果您还有其他问题需要评论,我会尽力帮助您。