2012-07-18 64 views
1

我對Groovy非常陌生。我正在用它的屬性來解決斐波那契數列。我有一個Groovy這樣的代碼:這個未知的源錯誤是什麼意思?

a = new BigInteger[2][2] 
a[0][0] = 1 
a[0][1] = 1 
a[1][0] = 1 
a[1][1] = 0 
temp = new BigInteger[2][2] 
temp = a 
def testFun(def a,BigInteger n) { 
    if(n == 1) 
     return a 
    b = new BigInteger[2][2] 
    def sum = 0 
    for (c = 0 ; c < 2 ; c++) { 
       for (d = 0 ; d < 2 ; d++) 
       { 
        for (k = 0 ; k < 2 ; k++) 
        { 
         sum = sum + temp[c][k] * a[k][d]; 
        } 
      b[c][d] = sum 
       sum = 0; 
      } 
     } 
     testFun(b,n-1) 
} 
c = new BigInteger[2][2] 
BigInteger n = 90 
if(n % 2 == 0) 
{ 
     c = testFun(a,n.divide(2)) 
     temp = c 
     c = testFun(c,2) 
} 
println c[0][1] 

我得到的答案一樣:

2880067194370816120 

但是當我改變N值說5090,我得到一個很大的錯誤是這樣的:

at fibb.testFun(fibb.groovy:24) 
    at fibb$testFun.callCurrent(Unknown Source) 
    at fibb.testFun(fibb.groovy:24) 
    at fibb$testFun.callCurrent(Unknown Source) 
    at fibb.testFun(fibb.groovy:24) 
    at fibb$testFun.callCurrent(Unknown Source) 
    at fibb.testFun(fibb.groovy:24) 
    at fibb$testFun.callCurrent(Unknown Source) 
    at fibb.testFun(fibb.groovy:24) 
    at fibb$testFun.callCurrent(Unknown Source) 
    at fibb.testFun(fibb.groovy:24) 
    at fibb$testFun.callCurrent(Unknown Source) 
    at fibb.testFun(fibb.groovy:24) 
    at fibb$testFun.callCurrent(Unknown Source) 
    at fibb.testFun(fibb.groovy:24) 
    at fibb$testFun.callCurrent(Unknown Source) 
    at fibb.testFun(fibb.groovy:24) 
    at fibb$testFun.callCurrent(Unknown Source) 
    at fibb.testFun(fibb.groovy:24) 
    at fibb$testFun.callCurrent(Unknown Source) 
    at fibb.testFun(fibb.groovy:24) 
    at fibb$testFun.callCurrent(Unknown Source) 
    at fibb.testFun(fibb.groovy:24) 
    at fibb$testFun.callCurrent(Unknown Source) 
    at fibb.testFun(fibb.groovy:24) 
    at fibb$testFun.callCurrent(Unknown Source) 
    at fibb.testFun(fibb.groovy:24) 
    at fibb$testFun.callCurrent(Unknown Source) 
    at fibb.testFun(fibb.groovy:24) 
    at fibb$testFun.callCurrent(Unknown Source) 
    at fibb.testFun(fibb.groovy:24) 
    at fibb$testFun.callCurrent(Unknown Source) 
    at fibb.testFun(fibb.groovy:24) 
    at fibb$testFun.callCurrent(Unknown Source) 
    at fibb.testFun(fibb.groovy:24) 
    at fibb$testFun.callCurrent(Unknown Source) 
    at fibb.testFun(fibb.groovy:24) 
    at fibb$testFun.callCurrent(Unknown Source) 
    at fibb.testFun(fibb.groovy:24) 
    at fibb$testFun.callCurrent(Unknown Source) 
    at fibb.testFun(fibb.groovy:24) 
    at fibb$testFun.callCurrent(Unknown Source) 
    at fibb.testFun(fibb.groovy:24) 
    at fibb$testFun.callCurrent(Unknown Source) 
    at fibb.testFun(fibb.groovy:24) 
    at fibb$testFun.callCurrent(Unknown Source) 
    at fibb.testFun(fibb.groovy:24) 
    at fibb$testFun.callCurrent(Unknown Source) 
    at fibb.testFun(fibb.groovy:24) 
    at fibb$testFun.callCurrent(Unknown Source) 
    at fibb.testFun(fibb.groovy:24) 
    at fibb$testFun.callCurrent(Unknown Source) 
    at fibb.testFun(fibb.groovy:24) 
    at fibb$testFun.callCurrent(Unknown Source) 
    at fibb.testFun(fibb.groovy:24) 
    at fibb$testFun.callCurrent(Unknown Source) 
    at fibb.testFun(fibb.groovy:24) 
    at fibb$testFun.callCurrent(Unknown Source) 
    at fibb.testFun(fibb.groovy:24) 
    at fibb$testFun.callCurrent(Unknown Source) 
    at fibb.testFun(fibb.groovy:24) 
    at fibb$testFun.callCurrent(Unknown Source) 
    at fibb.testFun(fibb.groovy:24) 
    at fibb$testFun.callCurrent(Unknown Source) 
    at fibb.testFun(fibb.groovy:24) 
    at fibb$testFun.callCurrent(Unknown Source) 
    at fibb.testFun(fibb.groovy:24) 
    at fibb$testFun.callCurrent(Unknown Source) 
    at fibb.testFun(fibb.groovy:24) 
    at fibb$testFun.callCurrent(Unknown Source) 
    at fibb.testFun(fibb.groovy:24) 
    at fibb$testFun.callCurrent(Unknown Source) 
    at fibb.testFun(fibb.groovy:24) 
    at fibb$testFun.callCurrent(Unknown Source) 
    at fibb.testFun(fibb.groovy:24) 
    at fibb$testFun.callCurrent(Unknown Source) 
    at fibb.testFun(fibb.groovy:24) 
    at fibb$testFun.callCurrent(Unknown Source) 
    at fibb.testFun(fibb.groovy:24) 
    at fibb$testFun.callCurrent(Unknown Source) 
    at fibb.testFun(fibb.groovy:24) 
    at fibb$testFun.callCurrent(Unknown Source) 
    at fibb.testFun(fibb.groovy:24) 
    at fibb$testFun.callCurrent(Unknown Source) 
    at fibb.testFun(fibb.groovy:24) 
    at fibb$testFun.callCurrent(Unknown Source) 

出了什麼問題?爲什麼我得到這個錯誤?

回答

2

儘管我期望在該堆棧跟蹤中看到一個StackOverflowException,但也許您只是將其剪掉。我認爲你正在運行最大遞歸深度,這就是爲什麼它可以爲小值n工作,但會失敗並具有較大的值。你想看看閉環蹦牀,Groovy 1.8的一部分。以下是release notes的相關部分。

也有this question這是相似的,應該幫助你。

順便說一句,在堆棧跟蹤它說的原因「未知源」是因爲Groovy不具有其源代碼可以告訴你哪一行是 - 它是一個紅色的鯡魚。

+0

尾遞歸優化是否會阻止堆棧溢出,或者這不是它所做的? – 2012-07-18 17:50:21

+1

+1它可能是其中有大量的顯示問題蹤跡如你堆棧溢出異常得到Groovy的控制檯運行 – 2012-07-18 17:52:13

+0

[@arxanas](http://stackoverflow.com/questions/11546969/what-does-this-unknown -source-error-mean#comment15270006_11547345)Groovy不會執行尾部調用消除。它確實有[trampolines](http://java.dzone.com/articles/cool-stuff-groovy-18)。 – 2012-07-18 19:01:16