Fibonacci-Zahlen rekursiv und iterativ brechnen.
#include<iostream>
using namespace std;
int fibIter(int);
int fibRec(int);
int main()
{
cout<<"Bitte eine Zahl eingeben: ";
int zahl;
cin>>zahl;
cout<<"Das Ergebnis ist "<<fibRec(zahl)<<"(rekursiv) und "<<fibIter(zahl)<<"(iterativ)\n";
}
int fibIter(int num)
{
int result=1;
int a=1;
int b=1;
for(int i=3; i<=num; ++i)
{
result=a+b;
a=b;
b=result;
}
return result;
}
int fibRec(int num)
{
if(num<=2)
return 1;
return fibRec(num-1) + fibRec(num-2);
}Wie man sieht ist die iterative Version zwar schneller, aber die rekursive wesentlich einfacher zu schreiben.
Mittels Memoization lässt sich die Rekursion sehr verschnellern. Memoization bedeutet: wir speichern die breits berechneten Werte, zB in einem Array. Denn wenn wir fib(10) berechnen, dann brauchen wir die Werte für fib(9) und fib(8) - allerdings ist fib(8) dann ja schon einmal berechnet worden (von fib(9)):
int array[500]={0};
int fibRec(int num)
{
if(num<=2)
return 1;
if(num<500)
{
if(array[num]==0)
{
array[num]=fibRec(num-1) + fibRec(num-2);
}
return array[num];
}
return fibRec(num-1) + fibRec(num-2);
}
Diese Version ist natürlich wesentlich schneller, da keine Werte mehr als einmal berechnet werden.