我有一个递归函数,适用于调用堆栈深度高达1000的输入,但是对于更大的输入则失败。我将函数转换为尾递归,并允许它达到大约1350。
有什么限制,有没有办法增加这个限制?
我正在使用纯函数,并希望避免使用操作。我有一个解决方案,将问题分解为一个步骤组合,每个步骤都有较小的堆栈深度,但它是相当人为的,因为它的唯一目的是避免问题而且它更复杂。
答案 0 :(得分:2)
这又是我的错误...... Java堆栈的设置是 -Xss (-Xms设置是起始堆大小),抱歉。因此,如果您在启动器的Debugger选项卡中使用JVM Arguments部分,并设置类似-Xss5m的内容,则应该更进一步。
在一个带递归函数的简单实验中,默认堆栈允许我深入227次调用。使用-Xss5m给了我4020个电话,-Xss10m给了我8050个电话。请注意,这些堆栈大小略小于您尝试的Gb大小 - 5Mb的堆栈是很多调用!
答案 1 :(得分:1)
Overture不会对底层Java堆栈限制施加堆栈限制,因此它只会尊重-Xms JVM参数。我认为解释器的常规执行堆栈来自Overture.ini文件(顶层),您可以在其中看到-Xmx参数来设置最大堆。您可以尝试添加(比方说)-Xms128m,或您选择的尺寸,看看是否能让您更进一步?
答案 2 :(得分:1)
听起来你问的是如何在Overture调试器中增加Java Stack Limit,而不是在Overture IDE(overture.ini)中。
要将其他参数传递给Overture调试器,您需要将它们添加到启动配置中:
答案 3 :(得分: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