Sunteți pe pagina 1din 8

2. Subalgoritmi, funcii.

Este foarte bine ca atunci cnd rezolvm o problem (mai ales dac aceasta este mai complex) s o mprim n subprobleme pe care apoi s le rezolvm pe rnd, eventual dac aceste subprobleme nu sunt simple, pot la rndul lor s fie mparite, pna cnd aceste subprobleme sunt elementare (simple). Aceasta

nseamn c o problem complex P se poate descompune n mai multe subprobleme mai simple Si . Algoritmul de rezolvare al unei subprobleme Si devine n acest caz un subalgoritm pentru algoritmul de rezolvare al problemei P. Se ntmpl frecvent ca ntr-o problem s ne confruntm de mai multe ori cu aceeai subproblem (eventual pentru alte date). n aceast situaie

subalgoritmul va trebui conceput ct mai general astfel nct s rezolve subproblema (solicitat de mai multe ori) chiar dac datele subproblemei se schimb. Subalgoritmul astfel conceput se va descrie o singur dat i va fi utilizat ori de cte ori este necesar. De asemenea este posibil ca o subproblem, la rndul su, s fie descompus n mai multe subprobleme mai simple, i aa mai departe. Aceasta nseamn c un subalgoritm poate s apleleze la rndul su unul sau mai muli subalgoritmi. Acest lucru chiar este recomandat pentru a amna detaliile

nesemnificative. Aceste detalii se vor descrie n subalgoritmii apelai. Uneori o subproblem se poate rezolva mai simplu aplelnd o funcie, care desigur va trebui s fie definit. Modul de utilizare i de descriere a funciilor va fi prezentat n paragraful 2.2.

12

2.1. Subalgoritmi.
Putem spune c, n general, un subalgoritm rezolv o anumit subproblem n funcie de anumite date de intrare i de nite rezultate (date de ieire) care vor fi folosite n problema care apeleaz (cheam) acest subalgoritm.
Parametri de Intrare

Subalgoritm

Parametri de iesire

Folosirea unui subalgoritm n cadrul unui algoritm se face apelnd acest subalgoritm prin :

Cheam Nume_Subalgoritm (Lista_parametri_actuali);

Lista parametrilor actuali conine toate datele de intrare (cele cunoscute n subproblema corespunztoare care pot fi anumite expresii) i toate rezultatele (datele de ieire, deci variabile) obinute n subalgoritm.

Definirea unui subalgoritm este asemntoare descrierii unui algoritm :

Subalgoritmul Nume_Subalgoritm (Lista_parametri_formali) Este : ... Sf_Subalgoritm.

{Antet}

{ Corp subalgoritm } { sau Sf_Nume_Subalgoritm. }

Parametrii formali marcheaz datele de intrare (cele presupuse cunoscute) i datele de ieire (rezultatele obinute de subalgoritm). ntre lista parametrilor formali din definiia subalgoritmului i lista parametrilor actuali din propoziia de apel trebuie s existe o coresponden biunivoca (ca numr, tip, ordine, etc).

13

Dac de exemplu pentru trei mulimi date A, B i C dorim s calculm AB, AC i BC, atunci vom apela un subalgoritm care construiete reuniunea a dou mulimi de trei ori. Acest subprogram va calcula
X,Y R:=XY R

reuniunea R :=XY, pentru orice mulimi X, Y date. Subprogramul va avea doi parametri (formali) de intrare X i Y i un parametru de ieire R. El va fi apelat pentru a calcula succesiv reuniunile AB, AC i BC.

Algoritmul Reuniuni Este : Date A,B,C; Cheam Reuniune (A,B,R1); Cheam Reuniune (A,C,R2); Cheam Reuniune (B,C,R3); Rezultate R1; Rezultate R2; Rezultate R3; Sf_Algoritm.

Subalgoritmul Reuniune ( X,Y, R ) Este : R:=X; Pentru fiecare yY Execut Dac yX Atunci R:=R{y} Sf_Dac Sf_Pentru Sf_Reuniune.

Subalgoritmul Reuninune determin mulimea R = X Y astfel : R := X (Y \ X), adic depune n reuniune mai nti elementele din mulimea X, la care apoi mai adaug acele elemente din Y care nu aparin lui Y. Se observ c nu toate propoziiile din subalgoritm sunt cele standard, deci va trebui n continuare s rafinm acest subalgoritm pn se ajunge la o form final. n primul rnd vom considera c o mulime este reprezentat sub forma unui ir care va conine elementele mulimii, iar pentru relaia de apartenen vom utiliza o funcie boolean Apart(b,A) care va preciza dac bA. Despre funcii vom

14

discuta n paragraful urmtor, aa c forma final a subalgoritmului o vom vedea imediat.

2.2. Funcii.

Destul de frecvent n cadrul unor algoritmi este necesar calculul valorilor unei funcii n diferite puncte. n aceast situaie este de preferat sa definim funcia printr-un subalgoritm de tip funcie dup care putem s o referim pentru calculele n care aceasta intervine. Definirea unui subalgoritm de tip funcie se aseamn cu descrierea anterioar (pentru subalgoritmi de tip procedur) avnd un antet (care precizeaz numele funciei i argumentele acesteia), un corp (prin care este descris subalgoritmul) i o marc de sfrit de funcie : Funcia Nume_Funcie (List_parametri_formali) Este : { Antetul funciei } ... Nume_Funcie := Expresie; ... Sf_Funcie. { Corpul funciei } { sau Sf_Nume_funcie.}

n corpul funciei trebuie s existe cel puin o atribuire prin care funcia primete o valoare. Apelul unei funcii se face scriind ntr-o expresie numele funciei urmat de lista parametrilor actuali. Trebuie s existe o corespondena biunivoca ntre parametrii actuali si cei formali folosii n definiia funciei. Dei denumirile variabilelor din cele dou liste pot s difere, rolul variabilelor care se corespund este acelai. Mai exact, parametrul formal si parametrul actual corespunztor trebuie s se refere la aceeai entitate, trebuie s aiba aceeai semnificaie, s reprezinte aceeai structur de date.

15

Este permis ca un subprogram de tip funcie s aib chiar i parametrii de ieire, deci din acest punct de vedere putem considera c o funcie este mai generoas pentru c va returna o valoare n plus prin valoarea funciei. De exemplu funcia Exist (b,A,n,p) de tip boolean ne va returna

valoarea True dac b se afl n irul A (cu n componente) i False n caz contrar. ns este posibil ca n primul caz (n care exist un element ap pentru care b=ap) s obinem i indicele (prima poziie) pe care se afl acel element. funcia se poate apela astfel : . . . Dac Exist (b,A,n, p) Sf_Dac; . . . Funcia Exist descris n continuare se poate uor simplifica pentru a obine o funcie Apart (b,A) util n exemplul anterior (yX). Funcia Exist ( b, A, n, p ) Este : p:=1; Ct_Timp (p<=n) i (b<>ap) Execut p:=p+1 Sf_Ct_Timp; Exist := (p<=n) Sf_Exist. n subalgoritmul Reuniune, secvena Dac yX Atunci R:=R{y} Sf_Dac; se poate nlocui cu secvena Dac Not Apart (y,X) Atunci R:=R{y} Sf_Dac; iar funcia Apart poate avea o prim form : Funcia Apart (b,A) Este : Atunci Tiparete p, ap Altfel Tiparete Nu exist. Atunci

16

p:=1;

{Card(A)=|A|}

Ct_Timp (p<=Card(A)) i (b<>A[p]) Execut p:=p+1 Sf_Ct_Timp; Apart := (p<=Card(A)) Sf_Apart. Dac elementele mulimii A le reinem n irul a1,a2,...,an , atunci putem s reinem i dimensiunea irului (n) pe pozitia 0 a irului (a0=n), aa cum vom vedea c se obinuiete i la unele structuri de date chiar n Pascal. n acest caz funcia Card este : Funcia Card (A) Este : Card := a0 Sf_Card. Exist numeroase probleme n care soluia (rezolvarea) recursiv este mult mai simpl. Este posibil ca un subalgoritm s se apeleze pe el nsui. ntr-un astfel de caz spunem c apelul este recursiv, iar subalgoritmul respectiv este definit recursiv. Un exemplu bine cunoscut este funcia factorial definit astfel: n! = n * (n1)! . Este ns foarte important ca acest funcie (formul) s fie complet, adic s capete consisten. Aceasta nseamn c trebuie definit o astfel de funcie i direct (nerecursiv), pentru anumite valori. n acest exemplu va trebui s dm

consistena formulei pentru n=1 sau n=0 , adic s precizm c 0!=1 sau 1! =1. n final putem s spunem c funcia factorial poate fi definit astfel : 1 n! = n * (n-1)! dac n>1 Subalgoritmul corespunztor este urmtorul: Funcia Factorial(n) Este: Dac n<2 dac n<2

17

Atunci Factorial:=1 Altfel Factorial:= n*Factorial(n1) Sf_Dac Sf_Factorial. Un alt exemplu de funcie recursiv descris n continuare determin maximul a n numere x1,x2 , ... ,xn (dintr-un ir X cu n componente). Dac reuim s scriem o funcie Max(X,k), care determin maximul pentru primele k elemente din ir, atunci o vom apela pentru calculul primelor n (adic pentru toate elementele irului, Max(X,n) i am rezolvat problema. Pentru a determina maximul primelor k elemente se observ c - dac k=1 (aici se defineste direct i dam consistena) atunci problema este simpl pentru c avnd un singur element, maximul este acel element (x1), - dac k>1 atunci putem rezolva problema pentru primele k dac am cunoate rezultatul pentru primele k-1 , (adic n funcie de Max(X,k-1) i putem vorbi de primele k-1 deoarece k>1). Dac maximul primelor k-1 este mai mic dect xk, atunci maximul dintre primele k elemente este xk, altfel maximul primelor k este egal cu maximul primelor k-1. De aici rezult c funcia care determin maximul dintr-un ir X cu n componente poate fi scris astfel : Funcia Max (X,k) Este : Dac k=1 Atunci Max:=x1 {Consistena} Altfel Max:= Max(X,k-1) Sf_Dac Sf_Dac Sf_Max. Funcia Apart (b,A,k) prin care putem decide dac b aparine primelor k elemente din irul A, poate fi scris recursiv astfel : FunciaApart (b,A,k) Este : Apart := (k>0) i ( Apart(b,A,k-1) Sau (b=ak) ) Altfel Dac Max(X,k-1) < xk Atunci Max:= xk

18

Sf_Apart. ( b aparine primelor k dac irul are cel puin un element (k>0) i b aparine sau subirului primelor k-1 elemente sau este egal cu elementul ak. Prin apelul Apart(b,A,Card(A)) putem decide dac bA sau bA.

19

S-ar putea să vă placă și