解决C+中的StackOverFlowException+; 我试图用递归来编写一个程序,用于C++中数组元素的选择(VS2010)。对于较小的数组,当我将数组大小增加到10000时,如果数组大小小于10,则该程序不会出现任何问题。我面临stackoverflow异常。我如何着手解决这个问题

解决C+中的StackOverFlowException+; 我试图用递归来编写一个程序,用于C++中数组元素的选择(VS2010)。对于较小的数组,当我将数组大小增加到10000时,如果数组大小小于10,则该程序不会出现任何问题。我面临stackoverflow异常。我如何着手解决这个问题,c++,stack-overflow,C++,Stack Overflow,谢谢你迄今为止的回答。我的想法不是对数组进行排序,而是使用递归和hit a stackoverflow异常对大型数组进行排序。我的主要想法是学习解决stackoverflow异常的方法,而不是对数组进行排序 selectionSortRecursive(int a[], int startindex, int endindex) { if (startindex<endindex) { int s = startindex; for (int

谢谢你迄今为止的回答。我的想法不是对数组进行排序,而是使用递归和hit a 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);
    }

}
selectionSortRecursive(int a[],int startindex,int endindex)
{
if(StartIndex StartIndex)
{
a[s]=a[startindex]+a[s];
a[startindex]=a[s]-a[startindex];
a[s]=a[s]-a[startindex];
}
选择或递归(a,开始索引+1,结束索引);
}
}

增加堆栈的大小(这可以通过
堆栈
链接器选项完成),或者——这是一个更好的选项——改进或替换算法。听起来递归算法可能不适合您需要处理的数据类型,但是您可以通过在每个方法调用中使用较少的局部变量和/或参数来改进,以使堆栈帧更小。

或者增加堆栈的大小(可以使用
堆栈
链接器选项来完成)或者——这是一个更好的选择——改进或替换您的算法。听起来递归算法可能不适合您需要处理的数据类型,但是您可以通过在每次方法调用中使用较少的局部变量和/或参数来改进,以使堆栈帧更小。

您可能知道,局部变量保留在堆栈上

当一个函数递归时,每次调用的局部变量在其各自的函数执行期间保持在堆栈上。如果递归次数过多,则生成量将过大,最终可能会出现堆栈溢出异常(如您遇到的),或者出现分段错误,堆栈溢出到受保护的内存中


这是最基本的,除了增加可用内存或将函数重写为迭代函数之外,没有其他方法可以解决此问题。

您可能知道,局部变量保留在堆栈上

当一个函数递归时,每次调用的局部变量在其各自的函数执行期间保持在堆栈上。如果递归次数过多,则生成量将过大,最终可能会出现堆栈溢出异常(如您遇到的),或者出现分段错误,堆栈溢出到受保护的内存中


这是最基本的,除了增加可用内存或将函数重写为迭代函数之外,没有其他方法可以解决此问题。

您要么使用大量本地存储,要么递归算法通过后续调用爆炸内存使用量。在任何一种情况下,迭代解决方案都可能解决您的问题。

您可能正在使用大量本地存储,或者您的递归算法会通过后续调用爆炸内存使用量。在任何一种情况下,迭代解决方案都可能解决您的问题。

是否可以向我们展示一个代码示例?除非您发送任何代码,否则我们怎么知道?递归是堆栈溢出的原因。给我们看一些代码,也许有些东西可以优化。你最好是用循环而不是递归重写你的方法。如果可以将递归方法重写为尾部递归,那么使用循环很容易再次重写它。检查一下为什么在这样简单的排序中有递归?请看。有没有可能给我们看一个代码示例?除非您发送任何代码,否则我们怎么知道?递归是堆栈溢出的原因。给我们看一些代码,也许有些东西可以优化。你最好是用循环而不是递归重写你的方法。如果可以将递归方法重写为尾部递归,那么使用循环很容易再次重写它。检查一下为什么在这样简单的排序中有递归?看见