Documente Academic
Documente Profesional
Documente Cultură
● Recursivitate
● Explicaţii şi teste
● Fractali. Proprietăţi
● Setul Mandelbrot
● O culme muntoasă
● Setul Sierpinski
1
Aplicaţie pentru stive şi cozi
● Temă de laborator
● Translatarea unei expresii aritmetice din forma
un string
● Programul trebuie să evalueze expresia şi să
2
Expresie aritmetică postfixată
● notaţia infixată: 2+3
● notaţia prefixată: + 2 3 (forma poloneză)
● inventată de matematicianul polonez Jan Lukasiewicz
(scăpăm de paranteze)
● notaţia poloneză inversă, sau notaţia postfixată pentru
expresia (2 + 3) * 7 este 2 3 + 7 *
● notaţia postfixată nu necesită paranteze şi poate fi evaluată
4
Exemplu de evaluare postfixată
532*+4–5+ 532*+4–5+ 532*+4–5+
2
3 3
5 5 5
6 4
5 11 11
5 Rezultatul
7 7 12 evaluării
expresiei
5
Translatarea unei expresii din forma
infixată în forma postfixată (i)
3 * X + (Y – 12) - Z 3 * X + (Y – 12) - Z 3 * X + (Y – 12) - Z
6
Translatarea unei expresii din forma
infixată în forma postfixată (ii)
3 * X + (Y – 12) - Z 3 * X + (Y – 12) - Z 3 * X + (Y – 12) - Z
- -
( Tiparit: ( Tiparit: Tiparit:
+ 3X*Y + 3 X * Y 12 + 3 X * Y 12 -
- este pus pe stivă (era numerele se tipăresc se scoate tot până la
doar paranteza) paranteza (
Tiparit:
Tiparit: Tiparit: 3 X * Y 12 - + Z -
- 3 X * Y 12 - + - 3 X * Y 12 - + Z
tipăreşte, + are aceeaşi operandul se tipăreşte goleşte stiva
precedenţă cu -
7
Algoritmul de translatare
● iniţializează stiva
● repetă paşii următori
● dacă urmează o paranteză deschisă “(“, atunci o pune în stivă
9
Metode recursive
10
:-P
Recursion
If you still don't get it, See: "Recursion".
Recursive acronyms
● GNU: GNU's Not Unix
11
Metoda writeVertical
● problema: să se scrie cifrele unui număr pe verticală,
folosind o metodă recursivă
public class RecWrite
{
public static void writeVertical (int number)
{
if( number < 10 )
System.out.println (number); problema opririi
else
{
writeVertical (number / 10); apelul recursiv
System.out.println (number % 10);
}
}
1234 < 10 ? NU
apel writeVertical( 123 )
apelăm writeVertical(123)
scriem cifra '4'
123 < 10 ? NU
apelăm writeVertical( 12 )
apel writeVertical( 12 )
scriem cifra '3'
12 < 10 ? NU
apelăm writeVertical(1)
apel writeVertical( 1 )
scriem cifra '2'
1 < 10 ? DA
scriem cifra '1'
13
Desfăşurarea apelurilor (II)
apel writeVertical( 1234 ) apel writeVertical( 123 )
1 < 10 ? DA 12 < 10 ? NU
scriem cifra '1' apelăm writeVertical(1)
scriem cifra '2'
14
Desfăşurarea apelurilor (III)
folosind stiva
● Instrucţiunea de după apel se execută după ce s-a
15
Teste - A
16
Teste - B
17
Teste - C
18
Fractali
● Noţiunea de “fractal” inventată de Benoît
Mandelbrot (1975) descrie obiecte a căror
porţiune mărită (cu o lupă) prezintă similaritate
cu întregul obiect
● Denumire derivată din latinescul fractus
detaliu:
20
Proprietăţi
c) două mijloace
sunt mutate d) se mută patru mijloace
22
O coamă muntoasă
Procedeul se aplică
recursiv până când
distanţa dintre două
puncte devine < 50
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;
25
cubFractal (0, 0, width, height);
public void cubFractal (
int leftX, int leftY, int rightX, int rightY) {
final int STOP = 4;
int midX, midY;
Fractal descris
în 1915 de către
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 iniţial
29
Procedura de generare
public void sierpinski (Pair a, Pair b, Pair c) {
if (Pair.len (a, b) < 10) {
drawArea.drawLine (a.x, a.y, b.x, b.y);
drawArea.drawLine (b.x, b.y, c.x, c.y);
drawArea.drawLine (a.x, a.y, c.x, c.y);
return;
}
}
30
Mult mai mult
http://en.wikipedia.org/wiki/Fractal
31