Переполнение стека при рекурсии

299
06 февраля 2018, 09:34

Имеется код:

#include <iostream>
#include <ctime>
#include <limits>
using namespace std;
void generateArray(int *arr, int size);
void showArray(int *arr, int size);
void changeElementsWithRecursion(int *arr, int size, int &i);
void input(int &size);
int main() {
    cout << "Enter the size:" << endl;
    int size = 0;
    while (true) {
        input(size);
        if (size > 0)
            break;
    }
    int i = 0;
    int *arr = new int[size];
    generateArray(arr, size);
    showArray(arr, size);
    changeElementsWithRecursion(arr, size, i);
    cout << "Transformed array:" << endl;
    showArray(arr, size);
    system("pause");
    return 0;
}
void generateArray(int *arr, int size) {
    srand(time(NULL));
    for (int i = 0; i < size; i++) 
        arr[i] = rand() % 2;
}
void showArray(int *arr, int size) {
    for (int i = 0; i < size; i++) 
        cout << arr[i] << " ";
    cout << endl;
}
void changeElementsWithRecursion(int *arr, int size, int &i) {
    if (i == 0)
        if (arr[1] == 1) 
            arr[i] = 0;
    else if (i == size - 1) {
        if (arr[i - 1] == 1) 
            arr[i] = 0;     
        return;
    }
    else if (arr[i - 1] == 1 || arr[i + 1] == 1) 
        arr[i] = 0;
    i++;
    changeElementsWithRecursion(arr, size, i);
}
void input(int &size) {
    while (true) {
        cin >> size;
        if (cin.good()) 
            break;
        cout << "Wrong input" << endl;
        cin.clear();
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
    }
}

Задача - заменить все элементы массива, граничащие с 1 на 0, при помощи рекурсии. Рассуждал так: если нулевой элемент массива - проверял только следующий элемент, если последний - проверял предыдущий, а в других случаях проверял и следующий и предыдущий. Однако при выполнении выбивает исключение:

Необработанное исключение по адресу 0x003E2509 в Project1.exe: 0xC00000FD: Stack overflow (параметры: 0x00000001, 0x00C02F9C).

И указывает на строку

void changeElementsWithRecursion(int *arr, int size, int &i) {

В чём проблема?

Answer 1
if (i == 0)
    if (arr[1] == 1) 
        arr[i] = 0;
else if (i == size - 1) {

Скобки поставь.

if (i == 0) {
    if (arr[1] == 1) 
        arr[i] = 0;
} else if (i == size - 1) {

PS: Отладчик же есть.

READ ALSO
Проблема с функцией обобщенного класса

Проблема с функцией обобщенного класса

В книге Шилдта наткнулся на такой пример :

199
Цикл не выдает правильный результат

Цикл не выдает правильный результат

Всех приветствую, вот код

246
Как скопилировать с помощью MinGW?

Как скопилировать с помощью MinGW?

Компилирую программу с помощью MinGW таким образом:

214
const = 0 после прототипа функции что означает?

const = 0 после прототипа функции что означает?

в библиотеке qwt, в файле qwt_series_datah, объявлен класс: QwtSeriesData

196