Porownanie Iteracji i rekurencji

10
Porównanie Iteracji i Rekurencji

description

rekurencja vs. iteracja

Transcript of Porownanie Iteracji i rekurencji

Porównanie

Iteracji i

Rekurencji

P.W II TI

Iteracja (łac. iteratio – powtarzanie) – czynność powtarzania (najczęściej wielokrotnego) tej samej instrukcji (albo wielu instrukcji) w pętli. Mianem iteracji określa się także operacje wykonywane wewnątrz takiej pętli.

Czynność iteracji przedstawia pętla, zapisana w poniższym pseudokodzie:

Mianem iteracji określa się także operacje wykonywane wewnątrz takiej pętli. W odróżnieniu od rekurencji, która działa "od góry", iteracja do obliczenia n+1-szej wartości wykorzystuje poprzednią, n-tą iterację. Rekurencja dla obliczenia n-tej wartości potrzebowała zejścia aż do pierwszej wartości.

W większości języków programowania istnieje co najmniej kilka instrukcji iteracyjnych. Najważniejsze z nich to instrukcje FOR, WHILE i REPEAT (w języku C DO-WHILE).

i=0 dopóki i<10 wykonuj i=i+1 przeskocz do góry

FOR jest instrukcją, która liczy dokładnie ilość iteracji pętli. Jest to przydatne, kiedy wiemy, ile dokładnie wywołań iteracyjnych będzie nam potrzebnych. W języku Pascal instrukcja ta ma postać:

FOR zmienna := wartość-początkowa TO wartość-końcowa DO

Lub

FOR zmienna := wartość-końcowa DOWNTO wartość-początkowa DO

Przykład zastosowania pętli FOR to obliczanie silni.

function Silnia(n:Integer):Integer;

var i: Integer; wynik: Integer;

begin

wynik := 1;

for i:=2 to n do

wynik := wynik * i;

Silnia := wynik;

end;

WHILE jest instrukcją, która zapewnia wykonywanie się instrukcji wewnątrz pętli dopóki spełniony jest warunek logiczny.

Oto postać instrukcji WHILE w języku Pascal:

WHILE warunek DO …

Oto to samo obliczanie silni, tym razem z wykorzystaniem pętli WHILE:

function Silnia(n:Integer):Integer;

var i: Integer; wynik: Integer;

beginwynik := 1;

i := 2;

while i<=n do

begin

wynik := wynik * i;

i := i+1;

end;Silnia := wynik;end;

Instrukcja REPEAT lub DO-WHILE jest używana dokładnie w takich samych wypadkach jak instrukcja WHILE, z tym, że warunek w niej podaje się na końcu, nie na początku pętli.

RekurencjaRekurencja jest techniką programowania, dzięki której procedura, funkcja lub podprogram jest w stanie w swoim ciele wywołać sam siebie. Trudno w to uwierzyć, ale niektóre "stare" języki programowania nie udostępniały możliwości wywołań rekurencyjnych.

Po co nam jest rekurencja? Przede wszystkim dzięki niej łatwo jest wykonać wiele zadań, w których potrzeba jest wyników cząstkowych do obliczenia całości. Sztandarowym przykładem w zagadnieniu rekurencji jest liczenie silni (n!), lub nieco bardziej zaawansowany przykład liczenia n-tej wartości w ciągu Fibonacciego.

program silnia1; uses crt; var n:integer; function silnia (n:integer) : integer; begin if n else if (n=1) or (n=0) then silnia := 1 else silnia :=n * silnia (n-1) ; end; begin writeln('dla jakiego n obliczymy iloczyn ?'); Readln; Writeln(silnia); readln; end.

program ciag_an; var n : integer; function a(n : integer) : integer; begin if n > 0 then begin writeln('n nie moze byc mniejsze od zera!'); exit; end else if n = 0 then a :=1 else a := a(n-1) - 3; end; begin writeln('Dla jekiego n obliczyć wyraz ciągu an?'); Readln; writeln('wyraz n-ty ciągu to : ', a); readln; end.

Dla przypomnienia, ciąg Fibonacciego jest ciągiem, w którym każda następna wartość jest równa sumie dwóch poprzednich. Równanie rekurencyjne, na którym opiera się podprogram rekurencyjny, ma postać:

Przykładowe programy :

Fn= Fn-1 + Fn-2

F0= 1 ; F1 = 1

Rekurencja działa dzięki temu, że za każdym razem, kiedy jest wywoływana, do życia jest powoływany nowy zestaw zmiennych lokalnych, zaś stare odkładane są na bok, w specjalnej strukturze danych zwanej stosem.

Dzięki za wszystko temu za każdym razem, kiedy program "wraca" z wywołań rekurencyjnych, może sięgnąć do dawnych wartości zmiennych i działać z nimi, przy okazji wiedząc dużo o innych wywołaniach rekurencyjnych samego siebie.

Istnieją problemy, które da się rozwiązać tylko dzięki rekurencji. Oczywiście można je zapisać iteracyjnie, jednak wówczas potrzebny jest nasz własny stos, o który będziemy sami dbali. Rekurencja ma tę ważną zaletę, że o wszystkim decyduje i o wszystko dba kompilator.

Źródło: http://moodle.mechaniak.edu.pl/mod/assignment/view.php?id=10210

http://www.bryk.pl/teksty/liceum/pozostałe/informatyka/15879-rekurencja_i_iteracja_różnice_i_podobieństwa.html