Porownanie Iteracji i rekurencji
-
Upload
pawel-paweo-woloch -
Category
Documents
-
view
215 -
download
1
description
Transcript of Porownanie Iteracji i rekurencji
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