我正在编写一个分支定界算法,它通过递归函数具有至少 10000 个级别,但由于堆栈溢出错误,它不起作用。这是我的 C++ 程序的一个简单实例:
void f(int k)
{
if(k==10000) return;
f(k+1);
}
void main()
{
f(1);
return;
}
有人可以帮忙吗?
我正在编写一个分支定界算法,它通过递归函数具有至少 10000 个级别,但由于堆栈溢出错误,它不起作用。这是我的 C++ 程序的一个简单实例:
void f(int k)
{
if(k==10000) return;
f(k+1);
}
void main()
{
f(1);
return;
}
有人可以帮忙吗?
这是一个链接器问题。您需要告诉链接器增加分配给堆栈的内存量。这对于不同的语言和编译器是不同的。它可以是命令行参数,也可以是配置文件,甚至可以在源代码中指定。
如果您使用的是 Linux(也可能是 Mac?),您可以使用 ulimit 命令。
但是您可能想研究优化算法或研究尾递归。
如果您使用 _beginthreadex,您可以指定堆栈大小。我相信默认值是 1MB。您可以分拆一个新线程来完成您的工作并指定您想要的任何堆栈大小。
任何递归算法都可以使用列表重写为非递归算法。通过这种方式,您将问题从堆栈大小转移到堆大小,堆通常(远)大于线程堆栈。还有堆栈大小链接器标志,取决于您的编译器/链接器和平台
或者您可以将递归重写为交互。
除了您的主要问题之外,您还可以使用 Valgrind 及其工具 Massif 来分析您的堆栈消耗内存(默认情况下,Massif 配置文件堆,但如果打开选项,也可以配置堆栈)。