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