将 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
}
}
测试代码可以在这里找到:
我正在自学 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
}
}
测试代码可以在这里找到: