我正在尝试编写一个程序来使用递归对C++ (VS2010)中的数组元素进行选择排序。对于较小的数组,当我将数组的大小增加到10000时,如果数组的大小小于10,则会遇到堆栈溢出异常。我该如何解决这个问题呢?
谢谢你到目前为止的答案。我的想法不是对数组进行排序,而是使用递归和命中堆栈溢出异常来对大型数组进行排序。我这个练习背后的主要想法是学习解决堆栈溢出异常的方法,而不是对数组进行排序。
selectionSortRecursive(int a[], int startindex, int endindex)
{
if (startindex<endindex)
{
int s = startindex;
for (int index=startindex+1;index<endindex;index++)
{
if (a[s]>a[index])
s=index;
}
if (s>startindex)
{
a[s]=a[startindex]+a[s];
a[startindex]=a[s]-a[startindex];
a[s]=a[s]-a[startindex];
}
selectionSortRecursive(a, startindex+1, endindex);
}
}发布于 2011-10-05 07:39:38
或者增加堆栈的大小(可以使用STACK链接器选项来完成),或者--这是一个更好的选项--改进或替换您的算法。听起来递归算法可能不适合您需要处理的数据类型,但也许您可以通过在每次方法调用中使用更少的局部变量和/或参数来改进,以使堆栈帧更小。
发布于 2011-10-05 07:42:48
你要么使用了大量的本地存储空间,要么你的递归算法会在后续调用中导致内存使用量激增。在任何一种情况下,迭代解决方案都可能解决您的问题。
发布于 2011-10-05 07:41:43
正如您可能知道的,局部变量保存在堆栈中。
当函数递归时,每次调用的局部变量都会一直保留在堆栈中,直到它们各自的函数执行为止。如果递归太多,堆积将会太大,很可能会出现堆栈溢出异常,就像你正在得到的那样,或者是分段错误,堆栈溢出到受保护的内存中。
这是最基本的,除了增加可用内存或将函数重写为迭代外,没有其他方法可以绕过它。
https://stackoverflow.com/questions/7655217
复制相似问题