[java.lang.OutOfMemoryError具有尾部递归

问题描述 投票:1回答:1

为什么我在使用诸如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 tail-recursion
1个回答
0
投票

没有两者将不会保留相同的内存量。

让我们尝试使用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用于这种字符串连接。

© www.soinside.com 2019 - 2024. All rights reserved.