递归调用栈深度

Recursive call stack depth

我有一个递归函数,适用于调用堆栈深度高达 1000 的输入,但无法处理更大的输入。我将函数转换为尾递归函数,使其达到大约 1350。

有什么限制,有什么方法可以提高该限制吗?

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

Overture 不会对底层 Java 堆栈限制强加堆栈限制,因此它只会遵守 -Xms JVM 参数。我认为解释器的常规执行堆栈来自 Overture.ini 文件(顶层),您可以在其中看到用于设置最大堆的 -Xmx 参数。您可以尝试添加(例如)-Xms128m 或您选择的尺寸,看看是否能让您走得更远?

我尝试将 -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

听起来您是在询问如何增加 Overture 调试器中的 Java 堆栈限制,而不是 Overture IDE(overture.ini)。

要更改将附加参数传递给 Overture 调试器,您需要将它们添加到启动配置中:

  1. 打开启动配置
  2. Select "Debugger" 选项卡
  3. 将您的参数添加到顶部 "Arguments:" 旁边显示的框中

Overture Launch configuration

这又是我的错误...Java 堆栈的设置是 -Xss(-Xms 设置是起始堆大小),抱歉。因此,如果您使用启动器调试器选项卡中的 JVM 参数部分,并设置类似 -Xss5m 的内容,您应该会更进一步。

在使用递归函数的简单实验中,默认堆栈允许我进行 227 次调用。使用 -Xss5m 给了我 4020 个调用,而 -Xss10m 给了我 8050 个调用。请注意,这些堆栈大小略小于您尝试的 Gb 大小 - 5Mb 的堆栈是很多调用!