Назначение - это разработка и разработка программы C++ для перечисления первых N членов серии Фибоначчи.
Результат должен выглядеть следующим образом:
Моя проблема заключается в том, что я написал рекурсивную функцию ниже, но я не уверен, как ее форматировать, чтобы она выводилась на экран в порядке, указанном выше.
#include <iostream>
using namespace std;
//Function Prototype
int fib(int);
int main()
{
for (int x = 0; x < 15; x++)
cout << fib(x) << " ";
cin.get();
cin.get();
return 0;
}
//Definition of fib
int fib(int n)
{
//Return 1 when n is 0
if ( n <= 0 )
return 0;
else if (n == 1)
return 1;
else
return fib(n-1) + fib(n-2);
}
Может ли кто-то пролить свет на то, как добиться этого?
Спасибо.
Поскольку все это означает, что напечатано число фибоначчи, и те, которые были раньше, вам просто нужно добавить их в свой вывод... У вас может быть либо сводная строка, которую вы передаете, которая будет удерживать все временные значения, либо просто вызвать другой метод, который будет иметь временные выходы. (разумеется, это не очень эффективно, хотя :)
int fib_verbose(int n)
{
//Return 1 when n is 0
if ( n <= 0 )
return 0;
else if (n == 1) {
return 1;
}
else {
int smaller = fib(n-2);
int larger = fib(n-1);
cout << smaller << " " << larger << endl;
return smaller + larger;
}
}
Вам нужно будет отсортировать пробелы и форматировать, но это суть.
Изменить: согласно комментарию agbinfo
: удалили печать 1
, а также сохранили переменные, поэтому нам не нужно их дважды называть. (Тем не менее, для эффективности взгляните на ответ Мариуса :)).
cout << 1
не помогает, но, что более важно, fib_verbose(nx)
будет выполняться рекурсивно. Вы, вероятно, хотите cout << fib_verbose(n-2) << fib(n-1);
если вы не слишком заботитесь об эффективности, двойная петля будет делать
for (int x = 2; x < 15; x++) {
cout << "N = " << x << " ";
for (int y = 2; y <= x; y++)
cout << fib(y) << " ";
cout << endl;
}
Я бы принял другой подход. Я бы сохранил уже рассчитанные значения Фибоначчи, чтобы они не вычисляли их снова и снова, как на карте, и не использовали эту карту для печати значений.
std::map<int, int> fibs;
int fib(int const n)
{
auto p = fibs.find(n);
if(p != fibs.end())
return p->second;
int f = 1;
if (n > 1)
{
f = fib(n-1) + fib(n-2);
}
fibs[n] = f;
return f;
}
Затем вы можете выполнить циклическое вычисление таких значений:
for(int n = 0; n < 10; ++n)
{
fib(n);
std::cout << "N=" << n << " ";
for(int i = 0; i <= n; ++i)
std::cout << fibs[i] << ",";
std::cout << std::endl;
}
std::vector
?
Как отформатировать?
У вас хорошее начало. Попробуйте это как следующий шаг...
for (int x = 0; x < 15; x++)
cout << x << "=" << fib(x) << " " << std::endl;
cin.get();
В моей системе я могу добавить в строку cout, скомпилировать и просмотреть результат в <10 секунд. Быстро оборачивайтесь и практикуйте (для вас) ваши друзья.
Вот пример, который не пересчитывает значения при вызове fib
для одного значения. Вы можете комбинировать идею Marius, чтобы вычислять значения один раз даже при нескольких запусках.
Фокус в том, что fib(unsigned&, unsigned)
вернет предыдущий фибоначчи, который он уже вычислил.
#include <iostream>
using namespace std;
unsigned fib(unsigned& m, unsigned n)
{
if (n==0) {
return 0;
}
if (n==1) {
m = 0;
// cout << "0,"; // uncomment if sequence should start with a 0
return 1;
}
unsigned prev;
m = fib(prev, n-1);
cout << m << ",";
return m+prev;
}
unsigned fib(unsigned n) {
unsigned prev;
unsigned f = fib(prev, n);
cout << f;
return f;
}
int main() {
for (unsigned i=2; i<13; i++) {
cout << "N=" << i << " ";
fib(i);
cout << endl;
}
return 0;
}
Будет распечатка:
N=2 1,1
N=3 1,1,2
N=4 1,1,2,3
N=5 1,1,2,3,5
N=6 1,1,2,3,5,8
N=7 1,1,2,3,5,8,13
N=8 1,1,2,3,5,8,13,21
fib(n)
выводит первые n
членов последовательности Фибоначчи.