为什么我在使用诸如2000之类的大数字调用第一个函数,而第二个实现没有错误时却得到java.lang.OutOfMemoryError:Java堆空间?
不会同时保留相同的内存量吗?
object TailRecursion extends App{
@tailrec
def repeatString (str: String, n:Integer ): String = {
if (n == 0) ""
else if (n == 1) str
else repeatString(str+str, n-1)
}
@tailrec
def repeatString(str:String, n:Integer, accumulator:String):String ={
if(n==0) accumulator
else repeatString(str, n-1, str+accumulator)
}
println(repeatString("teste", 0))
println(repeatString("teste", 1))
println(repeatString("teste", 2))
println(repeatString("teste", 2000))
}
没有两者将不会保留相同的内存量。
让我们尝试使用Scala中的for表达式来解决OutOfMemory
错误。它将大致翻译为以下代码:
def repeatStringLoop(string: String, n: Integer): String = {
var resultString = string
if (n == 0) ""
else if (n == 1) string
else {
for (i <- 0 until n) {
resultString = resultString.concat(resultString)
}
resultString
}
}
如果运行代码,它将引发相同的错误。这是因为您尝试将每个修改后的字符串连接两次-导致占用更多内存-与将字符串“ teste”连接到结果字符串不同。
但是,最好将StringBuilder
用于这种字符串连接。