Выдаешь ошибку "Необработанное исключение по адресу" c++

При работе программы выдает ошибку. "Необработанное исключение по адресу 0x003A2759 в ConsoleApplication2.exe: 0xC00000FD: Stack overflow (параметры: 0x00000001, 0x00862FF0)." Но ошибка вылезает не всегда, это сильно вводит в заблуждение и в итоге не понятно как решить проблему.

using namespace std;
#include <iostream>
#include <random>
#include <ctime>   

int fibonacci(int n)
{
    if (n < 1)
    {
        return 0;
    }
    if (n == 1)
    {
        return 1;
    }
    return fibonacci(n - 1) + fibonacci(n - 2);
}


int fibonacci_iteration(int n)
{
    int a = 0;
    int b = 1;
    for (int i = 0; i < n; i++)
    {
        a = a + b;
        b = a - b;
    }
    return a;
}


bool prime(long long n)
{
    for (long long index = 2; index < n; index++)
    {
        if (n % index == 0)
        {
            return  false;
        }
    }
    return true;
}


bool func_value_equality(long long func, int n)
{
    if (func == n)
    {
        return true;
    }
    return false;
}


bool func_square_value_equality(long long func, int n)
{
    if (func == n * n)
    {
        return true;
    }
    return false;
}


void fill_array(long long arr[], int i, long long n)
{
    arr[i] = n;
}


void print_array(long long arr[], int size)
{
    for (int i = 0; i < size; i++)
    {
        cout << " " << arr[i] << " ";
    }
}


unsigned long gcd_Euclid(long long a, long long b)
{
    while (a != b) 
    {
        if (a > b) 
        {
            long tmp = a;
            a = b;
            b = tmp;
        }
        b = b - a;
    }
    return a;
}


int main()
{
    random_device rd;
    mt19937 rndm(rd());
    setlocale(LC_ALL, "Russian");
    long long i, year, month, mounth;
    int count_equality = 0, count_square_equality = 0, count_prime = 0;
    cout << "Введите кол-во месяцев: ";
    cin >> i;
    cout << endl;

    for (month = 1; month <= i; ++month)
    {
        long long value = fibonacci(month);
        double fibonacci_division = (double(fibonacci(month + 1)) / double(fibonacci(month)));

        year = month / 12;
        mounth = month % 12;
        cout << "Прошел " << year << " лет и " << mounth << " месяцев" << endl;
        cout << "Количество пар кроликов: " << value << endl;
        cout << "Значение F(n+1)/F(n): " << fibonacci_division << endl;
        cout << "Приближенное значение номера числа Фибоначчи: " << month << endl;

        if (func_value_equality(value, month))
        {
            cout << "F(N) = N" << endl;
            count_equality += 1;
        }

        if (func_square_value_equality(value, month))
        {
            cout << "F(N) = N*N" << endl;
            count_square_equality += 1;
        }

        if (prime(value))
        {
            cout << "F(N) - Простое" << endl;
            count_prime += 1;
        }

        cout << endl;
        cout << endl;
    }

    long long* arr_equality = new long long[count_equality];
    long long* arr_square_equality = new long long[count_square_equality];
    long long* arr_prime = new long long[count_prime];

    int index1 = 0, index2 = 0, index3 = 0;

    for (month = 1; month <= i; ++month)
    {
        long long value = fibonacci(month);

        if (func_value_equality(value, month))
        {
            fill_array(arr_equality, index1, value);
            index1 += 1;
        }
        if (func_square_value_equality(value, month))
        {
            fill_array(arr_square_equality, index2, value);
            index2++;
        }
        if (prime(value))
        {
            fill_array(arr_prime, index3, value);
            index3++;
        }
    }

    cout << "Элементы, где F(N)=N " << endl;
    print_array(arr_equality, count_equality);
    cout << endl;
    cout << "Элементы, где F(N)=N*N " << endl;
    print_array(arr_square_equality, count_square_equality);
    cout << endl;
    cout << "Элементы, где F(N) - Простое " << endl;
    print_array(arr_prime, count_prime);
    cout << endl;
    cout << endl;

    int m, nod1, nod2;

    m = ((int(rndm()) % i)+1);
    nod1 = lcd_Euclid(fibonacci(i), fibonacci(m));
    nod2 = lcd_Euclid(i, m);
    cout << "Сгенерировалось число m = " << m << " n = " << i << endl;
    if (nod1 == nod2)
    {
        cout << "Показать, что НОД (Fn, Fm) = НОД (n,m) " << nod1 << " = " << nod2 << endl;
    }
    else
    {
        cout << "Показать, что НОД (Fn, Fm) != НОД (n,m)" << nod1 << " = " << nod2 << endl;
    }

    delete[] arr_equality;
    delete[] arr_square_equality;
    delete[] arr_prime;
    cout << endl;
    cout << endl;
    cout << "runtime = " << clock() / 1000.0 << endl;
}

http://cpp.sh/92hupc


Ответы (1 шт):

Автор решения: Harry

У вас очень глубокая рекурсия в lcd_Euclid(). Почему бы вам не воспользоваться для поиска НОД - наибольшего общего делителя - функцией gcd из стандартной библиотеки?

Если же по условию надо писать ее самому - то попробуйте, например, так:

long long gcd(long long m, long long n)
{
    while(m && n) if (m < n) n %= m; else m %= n;
    return (m == 0L) ? n : m;
}

И еще - такая рекурсия, как у вас для чисел Фибоначчи - это тоже ужас. Но не глубокий, а широкий. И при больших значениях будет конкретно тормозить программу. Воспользуйтесь итеративным вариантом.

→ Ссылка