Derekursywacja: Różnice pomiędzy wersjami

[wersja przejrzana][wersja nieprzejrzana]
Usunięta treść Dodana treść
Wycofano ostatnią zmianę (zrobioną przez 83.23.203.200) i przywrócono wersję 22717903 autorstwa Lampak; Usuwanie istotnych informacji.
złożoność
Linia 1:
'''Derekursywacja''' - przemiana algorytmów [[rekursja|rekurencyjnych (rekursyjnych)]] na [[iteracja|iteracyjne]]. Stosuje się ją w celu zwiększenia szybkości działania aplikacji (korzystającej z [[algorytm]]ów rekurencyjnych)programu oraz zmniejszenia jejjego zajętościużycia pamięciowejpamięci.
 
== Przykład ==
Linia 6:
unsigned long fibonacci( unsigned long n ){
if( n <= 1 ) return n;
return ( fibonacci( n - 1 ) + fibonacci( n - 2 ) );
}
</source>
Okazuje się, że jest to algorytm bardzo niewydajny, o złożoności czasowej <math>O(2^n)</math> i pamięciowej <math>O(2^n)</math>. Po derekursywacji, otrzymujemy algorytm iteracyjny, który działa zdecydowanie szybciej (złożoność czasowa <math>O(n)</math>, pamięciowa <math>O(n)</math>):
<source lang="cpp">
typedef unsigned long TypZmiennej;fibonacci( unsigned n ) {
typedef unsigned long TypWyniku;
 
TypWyniku fibonacci( TypZmiennej n ) {
if( n == 0 ) return 0;
TypWynikuunsigned long a = 0, b = 1;
for( TypZmiennejunsigned long i = 0 ; i < ( n - 1 ) ; ++i ) {
TypWyniku b = 1;
for( TypZmiennej i = 0 ; i < ( n - 1 ) ; ++i ) {
b = b + a;
a = b - a; // = poprzednia wartość 'b' - nie trzeba pamiętać w osobnej zmiennej