Sunteți pe pagina 1din 31

Structuri de Date n Java (VII)

Aplicaie pentru stive i cozi Evaluarea expresiei aritmetice postfixate Translatarea din form infixat n postfixat Recursivitate Explicaii i teste Fractali. Proprieti Setul Mandelbrot O culme muntoas Setul Sierpinski

Aplicaie pentru stive i cozi

Tem de laborator Translatarea unei expresii aritmetice din forma infixat cu paranteze n forma polonez invers (postfixat) Calcularea expresiei obinute Se citete ntreaga expresie de la tastatur, ntrun string Programul trebuie s evalueze expresia i s afieze forma postfixat asociat Eventualele erori trebuie semnalizate
2

Expresie aritmetic postfixat


notaia infixat: 2+3 notaia prefixat: + 2 3 (forma polonez) inventat de matematicianul polonez Jan Lukasiewicz expresia (2 + 3) * 7 se scrie n form polonez * + 2 3 7 (scpm de paranteze) notaia polonez invers, sau notaia postfixat pentru expresia (2 + 3) * 7 este 2 3 + 7 * notaia postfixat nu necesit paranteze i poate fi evaluat uor folosind o stiv principiul: se citete expresia postfixat; dac se ntlnete un numr, acesta se pune n stiv; un semn se folosete de ndat ce este ntlnit

Evaluarea unei expresii postfixate


while mai exist cuvinte n expresie do citete cuvntul urmtor if cuvntul este o valoare then push (cuvnt) else cuvntul este un operator pop () dou valori de pe stiv rezultat = aplicarea operator-ului valorilor push (rezultat) rezultatul final = pop () // rezultatul evalurii expresiei se gsete pe vrful stivei
4

Exemplu de evaluare postfixat


532*+45+ 532*+45+ 3 5 532*+45+ 532*+45+ 2 3 5 532*+45+ 4 11 532*+45+

5 532*+45+ 6 5 532*+45+

11 532*+45+ 5 7

12

Rezultatul evalurii expresiei

Translatarea unei expresii din forma infixat n forma postfixat (i)


3 * X + (Y 12) - Z Tiparit: 3 3 * X + (Y 12) - Z Tiparit: 3 3 * X + (Y 12) - Z Tiparit: 3X

numerele se tipresc
3 * X + (Y 12) - Z Tiparit: + 3X*

nmulirea pe stiv
3 * X + (Y 12) - Z Tiparit: ( + 3X*

operandul se tiprete
3 * X + (Y 12) - Z Tiparit: ( + 3X*Y

* are preceden mai mare dect + i se tiprete

( se pune pe stiv

operandul se tiprete

Translatarea unei expresii din forma infixat n forma postfixat (ii)


3 * X + (Y 12) - Z Tiparit: ( + 3X*Y 3 * X + (Y 12) - Z Tiparit: ( + 3 X * Y 12 3 * X + (Y 12) - Z Tiparit: + 3 X * Y 12 -

- este pus pe stiv (era doar paranteza)


3 * X + (Y 12) - Z Tiparit: - 3 X * Y 12 - +

numerele se tipresc

se scoate tot pn la paranteza (


3 * X + (Y 12) - Z Tiparit: 3 X * Y 12 - + Z -

3 * X + (Y 12) - Z Tiparit: - 3 X * Y 12 - + Z

tiprete, + are aceeai preceden cu -

operandul se tiprete

golete stiva

Algoritmul de translatare

iniializeaz stiva repet paii urmtori dac urmeaz o parantez deschis (, atunci o pune n stiv dac ns urmeaz un numr sau operand, atunci l tiprete dac ns e un operator, atunci: dac n vrful stivei este un alt operator cu precedena mai mare sau egal cu a acestuia, atunci se scoate acel operator din stiv i se tiprete se pune pe stiv operatorul altfel, ceea ce urmeaz este o parantez nchis ) se scot simboluri din stiv i se afieaz pn se ntlnete paranteza deschis corespondent, care se scoate i ea din stiv pn cnd expresia se termin se scot i se afieaz operatorii care au mai rmas n stiv (nu ar trebui s mai avem paranteze deschise)

Recursivitate
n matematic sau computer science, recursivitatea specific (sau construiete) o clas de obiecte sau metode prin definirea ctorva cazuri de baz (deseori doar unul) i prin descrierea regulilor ce descompun cazurile complexe ntr-unele mai simple. (Wikipedia)
9

Metode recursive
recursivitatea nseamn rezolvarea unei probleme cu ajutorul rezultatului obinut prin rezolvarea unei aceleiai probleme dar de mrime mai redus practic o metod se poate autoapela dar cu un argument de mrime mai mic se poate formula o abordare recursiv pentru o problem la formularea unei metode recursive, trebuie acordat atenie la evoluia argumentului metodei, pentru a nu ajunge la valori invalide

10

:-P
Recursion If you still don't get it, See: "Recursion". Recursive acronyms GNU: GNU's Not Unix PHP: PHP Hypertext Preprocessor GNU HURD: HIRD of Unix-Replacing Daemons HIRD: HURD of Interfaces Representing Death (hurd/hird/herd of gnus i.e. the antelope)
11

Metoda writeVertical

problema: s se scrie cifrele unui numr pe vertical, folosind o metod recursiv

public class RecWrite { public static void writeVertical (int number) { if( number < 10 ) problema opririi System.out.println (number); else { writeVertical (number / 10); apelul recursiv System.out.println (number % 10); } } public static void main (String[] args) { writeVertical (1234); }

12

Desfurarea apelurilor (I)


apel writeVertical( 1234 ) 1234 < 10 ? NU apel writeVertical( 123 ) apelm writeVertical(123) scriem cifra '4' 123 < 10 ? NU apelm writeVertical( 12 ) apel writeVertical( 12 ) scriem cifra '3' 12 < 10 ? NU apelm writeVertical(1) apel writeVertical( 1 ) scriem cifra '2' 1 < 10 ? DA scriem cifra '1' 13

Desfurarea apelurilor (II)


apel writeVertical( 1234 ) 1234 < 10 ? NU apelm writeVertical(123) scriem cifra '4' apel writeVertical( 123 ) 123 < 10 ? NU apelm writeVertical( 12 ) scriem cifra '3'

apel writeVertical( 1 ) 1 < 10 ? DA scriem cifra '1' 14

apel writeVertical( 12 ) 12 < 10 ? NU apelm writeVertical(1) scriem cifra '2'

Desfurarea apelurilor (III)


Colecia de parametri ai metodei curente precum i variabilele sale locale sunt salvate pe stiv nainte de efectuarea apelului recursiv La ntoarcerea din apel, se refac aceste valori tot folosind stiva Instruciunea de dup apel se execut dup ce s-a revenit din apel, valorile parametrilor rmn aceleai cu cele de dinainte de apel

15

Teste - A
// ce se afieaz pentru apelul f(3) ? public static void f(int n) { System.out.println (n); if (n > 1) f (n-1); }

16

Teste - B
// ce se afieaz pentru apelul f(3) ? public static void f(int n) { if (n > 1) f (n-1); System.out.println (n); }
17

Teste - C
// ce se afieaz pentru apelul f(3) ? public static void f(int n) { System.out.println (n); if (n > 1) f (n-1); System.out.println (n); }
18

Fractali
Noiunea de fractal inventat de Benot Mandelbrot (1975) descrie obiecte a cror poriune mrit (cu o lup) prezint similaritate cu ntregul obiect Denumire derivat din latinescul fractus Un fractal matematic este bazat pe o ecuaie iterativ, bazat pe recursie Structuri geometrice folosite de programatori pentru a realiza scene naturale reprezentnd arbori, muni, nori etc.

19

Setul Mandelbrot

detaliu:
20

Proprieti

Are o structur fin orict de mult ar fi mrit

Este mult prea neregulat pentru a fi descris cu ajutorul geometriei euclidiene

ntregul are aceeai form ca una sau mai multe pri ale sale (self-similarity)

Are o definiie simpl i recusiv


21

Generarea fractalilor

Punctul situat la jumtatea segmentului este deplasat n sus sau n jos cu o distan aleatoare Se aplic regula din nou pe subsegmentele create Se oprete cnd mrimea unui subsegment devine relativ mic

a) segmentul iniial

b) mijlocul segmentului este mutat mai sus sau mai jos

c) dou mijloace sunt mutate 22

d) se mut patru mijloace

O coam muntoas

Procedeul se aplic recursiv pn cnd distana dintre dou puncte devine < 50 (rezoluie 512 x 512)

23

randomFractal (0, height/2, width, height/2)


public void randomFractal ( int leftX, int leftY, int rightX, int rightY) { final int STOP = 50; int midX, midY, deltam, deltap, delta; if ((rightX - leftX) <= STOP) drawArea.drawLine (leftX, leftY, rightX, rightY); else { midX = (leftX + rightX) / 2; midY = (leftY + rightY) / 2; deltam = - (int)(Math.random() * midY / 2); deltap = (int)(Math.random () * (width - midY) / 2); delta = -deltam < deltap ? deltam : deltap; midY += delta; randomFractal (leftX, leftY, midX, midY); randomFractal (midX, midY, rightX, rightY);

24

Un fractal cu ptrate

Care este regula recursiv de formare?

Care este condiia de oprire ?

25

cubFractal (0, 0, width, height);


public void cubFractal ( int leftX, int leftY, int rightX, int rightY) { final int STOP = 4; int midX, midY; if (rightX - leftX <= STOP) drawArea.drawRect (leftX, leftY, rightX - leftX, rightY - leftY); else { midX = (leftX + rightX) / 2; midY = (leftY + rightY) / 2; drawArea.drawRect (leftX, leftY, midX - leftX, midY - leftY); drawArea.drawRect (midX, midY, rightX - midX, rightY - midY); cubFractal (midX, midY, rightX, rightY); cubFractal (midX, leftY, rightX, midY); cubFractal (leftX, midY, midX, rightY);

26

Triunghiul Sierpinski

Fractal descris n 1915 de ctre matematicianul polonez Waclaw Sierpinski

27

Abstractizarea unui punct


static class Pair { public int x; public int y; public Pair (int x, int y) { this.x = x; this.y = y; } public static Pair mid (Pair a, Pair b) { return new Pair ((a.x + b.x) / 2, (a.y + b.y) / 2); } public static int len (Pair a, Pair b) { double x = a.x - b.x; double y = a.y - b.y; x *= x; y *= y; return (int)Math.sqrt (x + y); } } 28

Triunghiul iniial

public void sierpinski () { Pair a = new Pair (width / 2, 0); Pair b = new Pair (0, height); Pair c = new Pair (width, height); sierpinski (a, b, c); }

29

Procedura de generare
public void sierpinski (Pair a, if (Pair.len (a, b) < 10) { drawArea.drawLine (a.x, drawArea.drawLine (b.x, drawArea.drawLine (a.x, return; } Pair ab = Pair.mid (a, b); Pair bc = Pair.mid (b, c); Pair ac = Pair.mid (a, c); sierpinski (a, ab, ac); sierpinski (ab, b, bc); sierpinski (ac, bc, c); } Pair b, Pair c) { a.y, b.x, b.y); b.y, c.x, c.y); a.y, c.x, c.y);

30

Mult mai mult

http://en.wikipedia.org/wiki/Fractal

31

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