Я пытаюсь заставить свою программу напечатать 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;
}
Необработанные массивы не растут по требованию, инициализатор используется для статического определения их размера, когда sie не включен в тип.
Эти два эквивалентны, оба определяют массив из двух элементов:
int f[] = { 1, 1 };
int f[2] = { 1, 1 };
То, что вы хотите использовать, это std::vector
или ручное динамическое перераспределение (используя либо malloc
, realloc
а также free
или же new[]
, delete[]
а также std::copy
).
Другим (предпочтительным) вариантом является наблюдение того факта, что вам нужны только предыдущие 2 значения для вычисления следующего и только их сохранения.
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];
}
повторное использование пространства больше не нужных значений.