Повреждение стека вокруг переменной `f`, пытающейся вычислить Фибоначчи (n)

Я пытаюсь заставить свою программу напечатать n-й номер Фибоначчи.
Я получаю утверждение о повреждении стека, хотя:

int f[] = { 1, 1 };
int i = 0;
if (n <= 2) {
cout << "F(" << n << ") = 1" << endl;
return 0;
}
if (n>2) {
i = 2;
while (i < n) {
cout << "i =" << i << endl;
cout << f[i - 1] << endl;
cout << f[i - 2] << endl;
f[i] = f[i - 1] + f[i - 2];
i++;
}
cout << "F(" << n << ") = " << f[i-1] << endl;
return 0;
}

0

Решение

Необработанные массивы не растут по требованию, инициализатор используется для статического определения их размера, когда sie не включен в тип.
Эти два эквивалентны, оба определяют массив из двух элементов:

int f[] = { 1, 1 };
int f[2] = { 1, 1 };

То, что вы хотите использовать, это std::vector или ручное динамическое перераспределение (используя либо malloc, realloc а также free или же new[], delete[] а также std::copy).

Другим (предпочтительным) вариантом является наблюдение того факта, что вам нужны только предыдущие 2 значения для вычисления следующего и только их сохранения.

3

Другие решения

int f[] = {1, 1};

создает массив с местом для ровно двух целых чисел. Таким образом, вы не можете писать или читать (или даже форму) f[i] за i > 1, Хотя вы могли бы использовать std::vector чтобы сохранить все значения рекурсии, было бы более эффективно вычислить ряд следующим образом:

int f[3] = {1, 1, 0};
for (int i = 1; i < n; ++i){
f[2] = f[0] + f[1];
f[0] = f[1];
f[1] = f[2];
}

повторное использование пространства больше не нужных значений.

0

По вопросам рекламы [email protected]