我有一个递归函数,适用于调用堆栈深度高达 1000 的输入,但对于更大的输入则失败。我将该函数转换为尾递归函数,使其可以达到 1350 左右。
有什么限制,有什么办法可以增加这个限制?
我正在使用纯函数,并希望避免使用操作。我有一个解决方案,可以将问题分解为多个步骤的组合,每个步骤的堆栈深度都较小,但这是相当人为的,因为它的唯一目的是避免问题,而且它更复杂。
我有一个递归函数,适用于调用堆栈深度高达 1000 的输入,但对于更大的输入则失败。我将该函数转换为尾递归函数,使其可以达到 1350 左右。
有什么限制,有什么办法可以增加这个限制?
我正在使用纯函数,并希望避免使用操作。我有一个解决方案,可以将问题分解为多个步骤的组合,每个步骤的堆栈深度都较小,但这是相当人为的,因为它的唯一目的是避免问题,而且它更复杂。
这又是我的错误……Java 堆栈的设置是-Xss(-Xms 设置是起始堆大小),抱歉。因此,如果您使用启动器的 Debugger 选项卡中的 JVM Arguments 部分,并设置类似 -Xss5m 的内容,您应该会走得更远。
在一个使用递归函数的简单实验中,默认堆栈允许我进行 227 次调用的深度。使用 -Xss5m 给了我 4020 个调用,而 -Xss10m 给了我 8050 个调用。请注意,这些堆栈大小比您尝试的 Gb 大小要小一些 - 5Mb 的堆栈是很多调用!
听起来您在询问如何在 Overture 调试器中而不是在 Overture IDE (overture.ini) 中增加 Java 堆栈限制。
要更改将附加参数传递给 Overture 调试器,您需要将它们添加到启动配置中:
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