Rekurencja zwana rekursją, polega na wywołaniu przez funkcję samej siebie.
Algorytmy rekurencyjne zastępują w pewnym sensie iteracje.
Niekiedy problemy rozwiązywane tą techniką będą nieznacznie wolniejsze (wiąże się to z wywoływaniem funkcji),
natomiast rozwiązanie niektórych problemów jest dużo prostrze w implementacji.
Działanie funkcji można przedstawić na diagramie:
Implementacja przedstawia się następująco:
#include <iostream>
using namespace std;
void dec2bin(int n)
{
if(n==0) return; //jesli n == 0 to zawracamy
dec2bin(n/2); //zagnieżdżamy rekurencję
cout<<n%2; //przy powrocie
}
int main()
{
int n;
cout<<"Podaj liczbę naturalną: ";
cin>>n;
cout<<"Postać binarna liczby "<<n<<": ";
if(n==0)
cout<<0;
else
dec2bin(n);
return 0;
}
#include<iostream>
using namespace std;
int NWD(int a, int b)
{
if(b!=0)
return NWD(b,a%b);
return a;
}
int main()
{
int a, b;
cout<<"Podaj dwie liczby: ";
cin>>a>>b;
cout<<"NWD("<<a<<","<<b<<") = "<<NWD(a,b)<<endl;
return 0;
}
#include <iostream>
using namespace std;
unsigned fib( unsigned n )
{
if( n == 0 ) return 0;
if( n <= 2 ) return 1;
return fib( n - 1 ) + fib( n - 2 );
}
int main()
{
cout << fib( 6 );
}
Procedura ta podaje n-ty element ciągu. W przypadku elementu szóstego ilość wywołań przedstawia się następująco: Widać zatem, że jest bardzo nieoptymalna.
Dla wskazania elementu 10-tego: ale już 15-tego:
Porównanie czas dla: 45, 47 i 50 elementu (czas podany jest w milisekundach):
Widać, że dla większych wartości praktycznie czas wykonania uniemożliwia podanie wyniku.
Procedura iteracyjna wyświetlająca wszystkie elementy wykonuje się w 6 ms - różnica jest zatem znacząca.