Witam
Pytanie typowo pod rozmowę rekrutacyjną. Czy da się poniższe prościej napisać?
#include <iostream>
#include <vector>
#include <exception>
using namespace std;
void wygenerujCiag(const int n, vector<int>& ciag)
{
if(n >= ciag.size())
throw std::runtime_error("Invalid ciag");
if(!n)
{
ciag.at(0) = 0;
return;
}
wygenerujCiag(n-1, ciag);
if(n==1)
ciag.at(1) = 1;
else
{
ciag.at(n) = ciag.at(n-1) + ciag.at(n-2);
}
}
void wypiszCiagFibonacciego(const int& n)
{
std::vector<int> ciag(n+1);
try
{
wygenerujCiag(n, ciag);
}
catch(const std::runtime_error& exc)
{
cout << exc.what() << endl;
}
cout << ciag.at(0) << endl;
cout << ciag.at(1) << endl;
for(size_t i = 2; i< ciag.size(); ++i)
cout << ciag.at(i) << " = " << ciag.at(i-1) << " + " << ciag.at(i-2) << endl;
}
int main()
{
wypiszCiagFibonacciego(10);
return 0;
}
Prościej mogłoby być tak:
#include <iostream>
using namespace std;
constexpr int wygenerujCiag(const int n)
{
return n >= 2 ? wygenerujCiag(n-2) + wygenerujCiag(n-1): n;
}
int main()
{
for(int i=0;i<10;++i)
cout << wygenerujCiag(i) << endl;
return 0;
}
ale wtedy liczymy dużo więcej razy ten sam wyraz ciągu z tym że w czasie kompilacji więc może to bez znaczenia?