2016-02-14 238 views
1

我有一個遞歸函數,可用於調用堆棧深度高達1000的輸入,但對於較大的輸入會失敗。我將函數轉換爲尾遞歸,並使其達到大約1350.遞歸調用堆棧深度

有什麼限制,有什麼辦法來增加這個限制嗎?

我正在使用純函數,並希望避免必須使用操作。我有一個解決方案,將問題分解爲步驟組合,每個步驟的堆棧深度都較小,但是它的設計很有意思,因爲它的唯一目的是避免這個問題,而且它更復雜。

回答

2

這又是我的錯誤... Java堆棧的設置是-Xss(-Xms設置是起始堆大小),對不起。因此,如果您在啓動器的「調試器」選項卡中使用JVM參數部分,並設置了類似-Xss5m的內容,則應該進一步完善。

在一個遞歸函數的簡單實驗中,默認堆棧允許深度爲227個調用。使用-Xss5m給了我4020個呼叫,-Xss10m給了我8050個呼叫。請注意,這些堆棧大小比您嘗試的Gb大小要小一些 - 5Mb的堆棧大量調用!

+0

非常感謝尼克。這解決了這個問題。現在沒問題。 – Paul

1

Overture不會對底層Java堆棧限制施加堆棧限制,所以它只會簡單地遵循-Xms JVM參數。我認爲解釋器的常規執行堆棧來自Overture.ini文件(頂層),您可以在其中看到用於設置最大堆的-Xmx參數。你可以嘗試添加(比如說)-Xms128m,或者你選擇的大小,看看是否讓你更進一步?

0

我試過-Xms和-Xmx都設置爲2048m,但沒有任何影響。我也在Mac OSX和Windows 10上嘗試過Overture 2.3.0,結果相同。

把我的項目圈外的,我創建了一個新的項目,一個很簡單的功能:

countdown(n:nat) res:nat 
    == if n=0 then n else countdown(n-1) 

在Windows和Mac我可以值807調用此並獲得成功,同時與808它失敗,錯誤:

internal error 

Main 206: Error evaluating code 
Detailed Message: internal error 
+0

好的,可能是解釋器沒有使用Overture.ini的堆棧大小 - 對不起,工具內部並不是我的區域(我擔心語言本身)。我會與團隊覈對。一個2Gb的堆棧是巨大的,所以顯然這個設置沒有效果。 –

1

這聽起來像你詢問如何增加Java堆棧限制在序曲調試器,而不是在序曲IDE(overture.ini)。

要更改傳遞附加參數,你需要將它們添加到啓動配置中的序曲調試器:

  1. 打開啓動配置
  2. 選擇「調試」選項卡
  3. 的添加參數下示出的框 「參數:」 在頂部

Overture Launch configuration

+0

啊是的!謝謝Kenneth :) –

+0

不幸的是,這並沒有解決我的問題。即使使用「-Xmx4096m -Xms4096m」作爲調試器參數,我也會得到相同的錯誤。在Windows和Mac上也有相同的結果。 – Paul