将 return 类型从 Unit 更改为 String 时 Scala 函数失败

Scala function fails when changing return type from Unit to String

我正在自学 Scala,并且一直在处理寻找 n 个括号的所有平衡对的算法问题。

因此,以下解决方案有效:

object GetAllValidParenthesis extends App {
  def generateParenthesis(n: Int): Unit = {

    parenthesis("", 0, 0, n)

  }
  
  private def parenthesis(output: String, open: Int, close: Int, pairs: Int): Unit = {
    if ((open == pairs) && (close == pairs)) {
      println(output)
    }
    else {
      if (open < pairs) parenthesis(output + "(", open + 1, close, pairs)
      if (open > close) parenthesis(output + ")", open, close + 1, pairs)
    }
  }

  println(generateParenthesis(3))
}

但是,如果我想 return 一个字符串而不是 Unit(以便稍后将所有字符串保存在某个数据结构中,如数组缓冲区),即,我这样做了:

private def parenthesis(output: String, open: Int, close: Int, pairs: Int): String = {
    if ((open == pairs) && (close == pairs)) {
      output
    }
    else {
      if (open < pairs) parenthesis(output + "(", open + 1, close, pairs)
      if (open > close) parenthesis(output + ")", open, close + 1, pairs)
    }
  }

编译器告诉我:

type mismatch;
 found   : Unit
 required: String
      if (open > close) parenthesis(output + ")", open, close + 1, pairs)

但是函数不可能 return 除了字符串之外的任何东西,因为唯一的“return”在“输出”行中,其余的都是递归调用。

为什么会这样?有什么办法可以解决这个问题吗?

在此先感谢您的帮助。

在 Scala 中,每个表达式都有一个值。

也就是说


// this is not a Boolean value
val exp = if (2 > 1) true

// in fact, is the same as following. The `Unit` and `Boolean`'s common type is `AnyVal`
val exp: AnyVal = if (2 > 1) true else {}

在您的问题中,您的函数应该生成一串括号并将其附加到结果集,而不仅仅是 return 值。

我刚刚写了这个问题solution

可能像下面这样更合适

import scala.collection.mutable.ArrayBuffer

object GenerateParenthesis {

  def generateParenthesis(n: Int): List[String] = {

    val res = ArrayBuffer.empty[String]

    def travel(l: Int, r: Int, curString: String): Unit = {
      if (l == 0 && r == 0) res += curString
      if (l > 0) travel(l - 1, r, curString + "(")
      if (r > l) travel(l, r - 1, curString + ")")
    }

    travel(n, n, "")
    res.toList
  }
}

测试代码可以在这里找到:

https://github.com/counter2015/LeetCodeScala/blob/6a3ff3d28a7b378490105684d080418c287680d8/src/test/scala/algorithms/medium/implementation/GenerateParenthesisTest.scala