Generalnie, taką prosta rekurencją nie da się wydrukować n
kolejnych liczb ciągu Fibonacciego, można tą funkcję, po prostu wydrukować w pętli:
long fibonacciNumber(long n) {
if (n == 0)
return 0;
else if (n == 1)
return 1;
else
return fibonacciNumber(n - 1) + fibonacciNumber(n - 2);
}
void printNthFibonacciNumbers(long n) {
for (long i = 0; i < n; ++i)
std::cout << fibonacciNumber(i)<<" ";
}
Jest to głupie, bo kompletnie nie efektywne, prawidłowe rozwiązanie problemu jest imperatywne:
void printNthFibonacciIterative(long n) {
long a = 1;
long b = 0;
long tmp = 0;
while (n > 0) {
std::cout << b <<" ";
tmp = a;
a = a + b;
b = tmp;
--n;
}
}
Ale na upartego, korzystając z powyższego kodu, da się wydrukować rekurencyjnie, optymalizując rekurencję do TCO (gdyby kompilator C++ tak robił, to poniższy kod, byłby równoważny powyższemu):
long printNthFibonacciRecursive(long a, long b, long n) {
if (n == 1) {
std::cout << b <<" ";
return b;
}
else {
std::cout << b <<" ";
return printNthFibonacciRecursive(a + b, a, n - 1);
}
}
I main:
int main(){
printNthFibonacciNumbers(7); // -> 0 1 1 2 3 5 8
std::cout << "\n";
printNthFibonacciIterative(7); // -> 0 1 1 2 3 5 8
std::cout <<"\n";
printNthFibonacciRecursive(1, 0, 7); // -> 0 1 1 2 3 5 8
std::cout << "\n";
return 0;
}