Ami*_*ani 2 stack-overflow scala
我在Scala中编写了这个基本程序:
import scala.collection.mutable.HashMap
object HelloWorld {
val treasureMap = new HashMap[BigInt, BigInt]
def main(args: Array[String]) {
println(fibCache(10))
}
def fibCache(n: BigInt): BigInt = {
if (n == 0 || n == 1) {
return n
}
return treasureMap.getOrElseUpdate(n, fibCache(n - 1) + fibCache(n - 2))
}
}
Run Code Online (Sandbox Code Playgroud)
我希望有很大的值,我会有一个OutOfMemoryError或者什么,但我看到了这个:
Exception in thread "main" java.lang.StackOverflowError
at java.math.BigInteger.compareMagnitude(Unknown Source)
at java.math.BigInteger.compareTo(Unknown Source)
at scala.math.BigInt.compare(BigInt.scala:141)
at scala.math.BigInt.$less$eq(BigInt.scala:145)
at scala.math.BigInt.fitsInLong(BigInt.scala:130)
at scala.math.BigInt.hashCode(BigInt.scala:120)
at scala.runtime.BoxesRunTime.hashFromNumber(Unknown Source)
at scala.collection.mutable.HashTable$HashUtils$class.elemHashCode(HashTable.scala:366)
at scala.collection.mutable.HashMap.elemHashCode(HashMap.scala:43)
at scala.collection.mutable.HashTable$class.findEntry(HashTable.scala:108)
at scala.collection.mutable.HashMap.findEntry(HashMap.scala:43)
at scala.collection.mutable.HashMap.get(HashMap.scala:63)
at scala.collection.mutable.MapLike$class.getOrElseUpdate(MapLike.scala:186)
at scala.collection.mutable.HashMap.getOrElseUpdate(HashMap.scala:43)
Run Code Online (Sandbox Code Playgroud)
有人可以帮忙解释原因吗?此外,是否有可用于缓解此问题的运行时设置?请问-Xss有帮助吗?
StackOverflowError是内存耗尽主题的变体,它只是准确地确定了哪个内存区域用完了.
所以是的,-Xss 会有所帮助,但还有更好的方法......
这个页面有几个可以尝试的替代实现:http://en.literateprograms.org/Fibonacci_numbers_(Scca)
您将需要使用尾递归或基于流的变体来保持堆栈大小.
| 归档时间: |
|
| 查看次数: |
432 次 |
| 最近记录: |