递归调用堆栈深度

时间:2016-02-14 01:02:15

标签: vdm++

我有一个递归函数,适用于调用堆栈深度高达1000的输入,但是对于更大的输入则失败。我将函数转换为尾递归,并允许它达到大约1350。

有什么限制,有没有办法增加这个限制?

我正在使用纯函数,并希望避免使用操作。我有一个解决方案,将问题分解为一个步骤组合,每个步骤都有较小的堆栈深度,但它是相当人为的,因为它的唯一目的是避免问题而且它更复杂。

4 个答案:

答案 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调试器,您需要将它们添加到启动配置中:

  1. 打开启动配置
  2. 选择"调试器"标签
  3. 将您的参数添加到"参数旁边显示的框中:"在顶部
  4. Overture Launch configuration

答案 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