我正在尝试使用递归编写一个程序,用于在C ++(VS2010)中选择数组元素。对于较小的数组,当我将数组的大小增加到10000时,该程序的工作没有任何问题,因为数组的大小小于10我面临stackoverflow异常。我该如何解决这个问题?
感谢您到目前为止的答案。我的想法不是对数组进行排序,而是使用递归对大型数组进行排序,然后点击stackoverflow异常。这个练习背后的主要思想是学习解决stackoverflow异常的方法,而不是排序数组。
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);
}
}
答案 0 :(得分:4)
增加堆栈的大小(可以使用STACK
链接器选项完成)或 - 这是一个更好的选择 - 改进或替换算法。听起来像递归算法可能不适合您需要处理的数据类型,但也许您可以通过在每个方法调用中使用更少的局部变量和/或参数来改进,以使堆栈帧更小。
答案 1 :(得分:2)
您要么使用大量本地存储,要么递归算法会在后续调用中爆炸内存使用。无论哪种情况,迭代解决方案都可能解决您的问题。
答案 2 :(得分:1)
您可能知道,局部变量会保留在堆栈中。
当函数递归时,只要各自的函数执行,每个调用的局部变量就会保留在堆栈中。如果你进行过多的计算,那么构建会太大,你最终可能会遇到堆栈溢出异常,就像你得到的那样,或者是一个分段错误,堆栈溢出到受保护的内存中。
这是基础,除了增加可用内存或重写函数以进行迭代之外,没有别的办法。