To zależy. I nie ma reguły, że rekurencja będzie zawsze szybsza od metody iteracyjnej i na odwrót. Są zagadnienia, które lepiej się rozwiązuje metodą rekurencyjną, a czasami lepiej jest użyć innej metody, np. iteracyjnej.
"Czy ferrrari z silnikiem od fiata 126p, będzie szybsze niż fiat 126p z silnikiem ferrari?"
To pytanie zostawie dla Was...
Szybkość wykonania programu, zależy tylko od programisty! Od tego jak wykorzystuje zasoby komputera, jaki napisze alogorytm i oczywiście jaką ma znajomość działania komputera. Rekurencja pomimo wielu zalet, ma też poważne wady. Np. to, że ilośc wywołań jest ograniczona wielkością stosu(tutaj zapraszam do lektury na temat stosu i sterty).
Różnica którą zaoberwowałeś w swoim kodzie wynika pewnie z mało optymalnej metody. Pozwolę sobie wkleić kod użytkownika Radfler. Z czasu wykonania pewnie wynika, że u siebie masz podobną implementację.
//Metoda rekurencyjna
unsigned long long fib(unsigned long long n)
{
if(n > 2)
return fib(n-1) + fib(n-2);
return 1;
}
//Metoda iteracyjna
unsigned long long fib_i(int num) {
unsigned long long x=1, y=1;
while(--num) x = (y += x) - x;
return x;
}
Moja implementacja:
//Zoptymalizowana rekurencja
unsigned long long fib_optimized(int n, unsigned long long n1 = 1, unsigned long long n2 = 1)
{
if(n == 2)
return n2;
return fib_optimized(n - 1, n2, n1 + n2);
}
Jak widac na powyższym przykładzie, rekurencja może być tak samo szybka jak metoda iteracyjna, albo nawet i szybsza... Wszytsko zależy od programisty!