Я изучаю некоторые начинающие алгоритмы, когда я знакомлюсь с C++. Уже есть некоторые ошибки, о которых я не знаю, с чего начать исправление.
1) Ниже приводятся множе- ственные ошибки во времени, когда функция fib()
возвращает результаты. EDIT: с входами> = 9
#include <iostream>
using namespace std;
int fib(int n) {
int fibs[] = {1, 1}; // dynamic array
int i = 2; // start at 3rd element
while(i < n) {
fibs[i] = fibs[i-2] + fibs[i-1];
cout << "DEBUG: fibs[" << i << "] = " << fibs[i] << endl;
i = i+1;
}
cout << "about to return to main()" << endl;
return fibs[n-1];
}
int main() {
cout << "\n================= Hello cruel world =================" << endl;
cout << "Enter a number: ";
int x;
cin >> x;
cout << "fib(" << x << ") = " << fib(x) << endl;
cout << "================ Goodbye cruel world ================\n" << endl;
return 0;
}
В противном случае код работает просто отлично, номера найдены правильно. Но 2) когда я меняю функцию на поддержку длинных целых чисел, она начинает действовать странно:
#include <iostream>
using namespace std;
long fib(int n) {
long fibs[] = {1L, 1L}; // dynamic array
int i = 2; // start at 3rd element
while(i < n) {
fibs[i] = fibs[i-2] + fibs[i-1];
cout << "DEBUG: fibs[" << i << "] = " << fibs[i] << endl;
i = i+1;
}
cout << "about to return to main()" << endl;
return fibs[n-1];
}
int main() {
cout << "\n================= Hello cruel world =================" << endl;
cout << "Enter a number: ";
int x;
cin >> x;
cout << "fib(" << x << ") = " << fib(x) << endl;
cout << "================ Goodbye cruel world ================\n" << endl;
return 0;
}
Вывод:
================= Hello cruel world =================
Enter a number: 7
DEBUG: fibs[2] = 2
DEBUG: fibs[0] = 1
DEBUG: fibs[1] = 30071067265
DEBUG: fibs[2] = 30071067266
DEBUG: fibs[14] = 0
about to return to main()
fib(7) = 140733637791872
================ Goodbye cruel world ================
Для меня это не имеет никакого смысла. Спасибо за любую помощь.
int fibs[] = {1, 1};
эквивалентно:
int fibs[2] = {1, 1};
Другими словами, массив fibs
(в обеих программах) имеет только два элемента, он не допускает доступа к fibs[n]
если n
больше 1
.
Другие ответы объясняют, что неправильно. Чтобы исправить это, вы можете объявить fibs
как вектор:
vector<int> fibs(n, 1);
который построит вектор из n целых чисел и инициализирует их все до 1. Замена этой единственной строки кода должна быть все, что вам нужно!
В
long fibs[] = {1L, 1L};
[]
не означает "столько, сколько нужно", это означает "подсчитать количество инициализаторов". Это то же самое, что и
long fibs[2] = { 1L, 1L };
И комментарий
// dynamic array
просто НЕПРАВИЛЬНО.
Да, это не сработает, потому что fibs [2] не существует!
Это не динамический массив каким-либо средним значением. Его массив из 2 длинных
long fibs[] = {1L, 1L}; // dynamic array
[]
означает неограниченный размер. Возможно, где-то есть плохой учитель или учебник.