2016-02-14 239 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