java.lang.OutOfMemoryError 尾递归
java.lang.OutOfMemoryError with tail recursion
为什么我得到 java.lang.OutOfMemoryError: Java heap space 当我用像 2000 这样的大数字调用第一个函数时我没有从第二个实现中得到错误?
两者不会保留相同数量的内存吗?
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
。
为什么我得到 java.lang.OutOfMemoryError: Java heap space 当我用像 2000 这样的大数字调用第一个函数时我没有从第二个实现中得到错误?
两者不会保留相同数量的内存吗?
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
。