【问题标题】:stack overflow error in c++C++中的堆栈溢出错误
【发布时间】:2016-01-17 00:19:42
【问题描述】:

我有一个对数组进行递归选择排序的函数:

void  SelectionSort::RecursiveSort(int ar[] , int flag, int first, int last){
    // first - index of first element and last - index of last element
    if (flag == 1)
    {
        if (first < last)               //ascending
        {
            for (int i = first; i <= last; i++) if (ar[i] < ar[first]) swap(ar[i], ar[first]);

            RecursiveSort(ar, flag, first + 1, last);
        }
        if (first == last) return;

    }
    else
    {
        if (first < last)                   //desc
        {
            for (int i = first; i <= last; i++) if (ar[i] > ar[first]) swap(ar[i], ar[first]);

            RecursiveSort(ar,flag, (first + 1), last);
        }
        if (first == last) return;

    }
}

如果数组大小为 3000,它工作正常,但我应该让这个工作为 size>5000 并且它崩溃导致堆栈溢出。

我搜索了很多线程,他们都告诉使用向量,我有。这是一个赋值问题,所以我应该对数组和向量进行递归排序。它适用于向量,但不适用于数组。我也不应该在这个作业中使用指针。

【问题讨论】:

  • Google 如何使用您使用的编译器增加堆栈

标签: c++ recursion stack-overflow


【解决方案1】:

你可以尝试使用尾递归,编译器会为你优化循环:

void AscRecursiveSort(int ar[], int first, int last) {
    if (first >= last) return;
    for (int i = first; i <= last; i++) if (ar[i] < ar[first]) swap(ar[i], ar[first]);
    AscRecursiveSort(ar, first + 1, last);

}

void DescRecursiveSort(int ar[], int first, int last) {
    if (first >= last) return;
    for (int i = first; i <= last; i++) if (ar[i] > ar[first]) swap(ar[i], ar[first]);
    DescRecursiveSort(ar, first + 1, last);
}

void RecursiveSort(int ar[], int flag, int first, int last) {
    // first - index of first element and last - index of last element
    if (flag == 1)
        AscRecursiveSort(ar, first, last);              //ascending
    else
        DescRecursiveSort(ar, first, last);
}

【讨论】:

  • 感谢尾递归。我通过增加 Visual Studio 中的堆栈大小解决了这个问题。
  • @ChiranthBs 注意其他人需要编译你的程序,他也需要这样做。这就是为什么它被认为是不好的做法
【解决方案2】:

如果您的编译器未优化尾递归,则该解决方案将不起作用,您需要重写为检查基本情况的while 循环。没有发布完整的解决方案,因为这看起来像是家庭作业。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-11
    • 2013-12-12
    • 1970-01-01
    • 2014-01-26
    • 2019-02-16
    • 2011-09-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多