2011-05-15 88 views
2

我在斯卡拉写这个基本程序:斯卡拉意外的堆栈溢出

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)) 
    } 
} 

和我期望与真值很大,我有一个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) 

有人可以帮助解释为什么吗?另外,有没有我可以用来缓解这种情况的运行时设置? -Xss会有帮助吗?

+0

刚刚在我的机器(3GB的Macbook)上运行它与最新版本的Scala,它按预期运行。 – 2011-05-15 16:39:47

+0

你使用了多大的价值?结果是什么? – 2011-05-15 16:41:17

+0

32/64位,可用物理内存和-Xss参数都将影响问题发生的确切位置,因此不要担心所选的实际数字。只要知道会有*某些*点就足够了,这取决于你的配置。 – 2011-05-15 16:58:24

回答

7

StackOverflowError是关于内存不足的主题的变体,它只是准确地确定哪个内存区域已用完。

所以,是的,-Xss帮助,但有一个更好的办法....

本页面有几个替代实现,你可以尝试:http://en.literateprograms.org/Fibonacci_numbers_(Scala)

你要使用的尾巴 - 递归或基于流的变体来减小堆栈大小。

+0

我很熟悉StackOverflow是什么。当我用Java编写这个等价物时,它不会这样。它在堆叠之前耗尽内存。 – 2011-05-15 16:45:22

+0

加1表示有用的链接... – 2011-05-15 16:45:43

+0

用于尾递归的+1 – 2011-05-15 16:49:02