1 Automazione dellalgoritmo ricorsivo di permutazione eseguita da Mariano Melchiorri.

33
1 Automazione dell’algoritmo ricorsivo di permutazione eseguita da Mariano Melchiorri

Transcript of 1 Automazione dellalgoritmo ricorsivo di permutazione eseguita da Mariano Melchiorri.

Page 1: 1 Automazione dellalgoritmo ricorsivo di permutazione eseguita da Mariano Melchiorri.

1

Automazione dell’algoritmo ricorsivo di permutazione eseguita da Mariano Melchiorri

Page 2: 1 Automazione dellalgoritmo ricorsivo di permutazione eseguita da Mariano Melchiorri.

2

PERM(Char []A,int K)

If(k=n) Controllo (A); else {for(int =k;i<n;i++);

SWAP(A[i],A[k]); PERM(A,K+1); SWAP(A[i],A[k]);}

Dove:1. n = dimensione dell’array A 2. Controllo è la chiamata ad un metodo che visualizza le permutazioni di A3. SWAP è la chiamata ad un metodo che scambia i valori degli elementi passati

come parametro attualeNelle diapositive successive è riportato lo stato degli indici k e i all’interno di ogni chiamata durante l’esecuzione del corpo del metodo.

Page 3: 1 Automazione dellalgoritmo ricorsivo di permutazione eseguita da Mariano Melchiorri.

3

PERM(Char []A,int K)

Invocazione (1) A={a,b,c}; n=A.length=3

PERM(A,0)

codice

1)If(k=n) Controllo (A); else{

2)for(int =k;i<n;i++);

3)SWAP(A[i],A[k]);

4)PERM(A,K+1);

5)SWAP(A[i],A[k]);}

Istr. k i A

1 0 a b c2 0 0 a b c3 0 0 a b c4 0 0 a b c

1° chiamata ricorsiva da (1)

Invocazione (2)2

Page 4: 1 Automazione dellalgoritmo ricorsivo di permutazione eseguita da Mariano Melchiorri.

4

PERM(Char []A,int K)

Invocazione (2) 1°chiamata da (1)

PERM(A,1)

codice

1)If(k=n) Controllo (A); else{

2)for(int i=k;i<n;i++);

3)SWAP(A[i],A[k]);

4)PERM(A,K+1);

5)SWAP(A[i],A[k]);}

Istr. k i A

1 1 a b c2 1 1 a b c3 1 1 a b c4 1 1 a b c

1° chiamata ricorsiva da (2)

Invocazione (3)

3

Page 5: 1 Automazione dellalgoritmo ricorsivo di permutazione eseguita da Mariano Melchiorri.

5

PERM(Char []A,int K)

Invocazione (3) 1°chiamata da (2)

PERM(A,2)

codice

1)If(k=n) Controllo (A); else{

2)for(int i=k;i<n;i++);

3)SWAP(A[i],A[k]);

4)PERM(A,K+1);

5)SWAP(A[i],A[k]);}

Istr. k i A

1 2 a b c2 2 2 a b c3 2 2 a b c4 2 2 a b c

1° chiamata ricorsiva da (3)

Invocazione (4)

4

Page 6: 1 Automazione dellalgoritmo ricorsivo di permutazione eseguita da Mariano Melchiorri.

6

PERM(Char []A,int K)

Invocazione (4) 1°chiamata da (3)

PERM(A,3)

codice

1)If(k=n) Controllo (A); else{

2)for(int i=k;i<n;i++);

3)SWAP(A[i],A[k]);

4)PERM(A,K+1);

5)SWAP(A[i],A[k]);}

Istr. k i A

1 3 a b c

Chiamata Controllo(A) e uscita con ritorno a Invocazione (3)

3

Permutazione a b c

Page 7: 1 Automazione dellalgoritmo ricorsivo di permutazione eseguita da Mariano Melchiorri.

7

PERM(Char []A,int K)

Invocazione (3) 1°chiamata da (2)

PERM(A,2)

codice

1)If(k=n) Controllo (A); else{

2)for(int i=k;i<n;i++);

3)SWAP(A[i],A[k]);

4)PERM(A,K+1);

5)SWAP(A[i],A[k]);}

Istr. k i A

1 2 a b c2 2 2 a b c3 2 2 a b c4 2 2 a b c5 2 2 a b c2 2 3 a b cFine primo ciclo di for

Incremento di i, uscita dal for e ritorno a Invocazione (2)

4

2

Page 8: 1 Automazione dellalgoritmo ricorsivo di permutazione eseguita da Mariano Melchiorri.

8

PERM(Char []A,int K)

Invocazione (2) 1°chiamata da (1)

PERM(A,1)

codice

1)If(k=n) Controllo (A); else{

2)for(int i=k;i<n;i++){

3)SWAP(A[i],A[k]);

4)PERM(A,K+1);

5)SWAP(A[i],A[k]);}}

Istr. k i A

1 1 a b c2 1 1 a b c3 1 1 a b c4 1 1 a b c5 1 1 a b c2 1 2 a b c3 1 2 a c b4 1 2 a c b

2° chiamata ricorsiva da 2Invocazione (5)

3

5

Page 9: 1 Automazione dellalgoritmo ricorsivo di permutazione eseguita da Mariano Melchiorri.

9

PERM(Char []A,int K)

Invocazione (5) 2°chiamata da (2)

PERM(A,2)

codice

1)If(k=n) Controllo (A); else{

2)for(int i=k;i<n;i++){

3)SWAP(A[i],A[k]);

4)PERM(A,K+1);

5)SWAP(A[i],A[k]);}}

Istr. k i A

1 2 a c b2 2 2 a c b3 2 2 a c b4 2 2 a c b

1° chiamata ricorsiva da (5)Invocazione (6)

6

Page 10: 1 Automazione dellalgoritmo ricorsivo di permutazione eseguita da Mariano Melchiorri.

10

PERM(Char []A,int K)

Invocazione (6) 1°chiamata da (5)

PERM(A,3)

codice

1)If(k=n) Controllo (A); else{

2)for(int i=k;i<n;i++){

3)SWAP(A[i],A[k]);

4)PERM(A,K+1);

5)SWAP(A[i],A[k]);}}

Istr. k i A

1 3 a c b

Chiamata Controllo(A) e uscita con ritorno a Invocazione (5)

5

Permutazione a c b

Page 11: 1 Automazione dellalgoritmo ricorsivo di permutazione eseguita da Mariano Melchiorri.

11

PERM(Char []A,int K)

Invocazione (5) 2°chiamata da (2)

PERM(A,2)

codice

1)If(k=n) Controllo (A); else{

2)for(int i=k;i<n;i++){

3)SWAP(A[i],A[k]);

4)PERM(A,K+1);

5)SWAP(A[i],A[k]);}}

Istr. k i A

1 2 a c b2 2 2 a c b3 2 2 a c b4 2 2 a c b5 2 2 a c b2 2 3 a c b

6

2

Incremento di i, uscita dal for e ritorno a Invocazione (2)

Page 12: 1 Automazione dellalgoritmo ricorsivo di permutazione eseguita da Mariano Melchiorri.

12

PERM(Char []A,int K)

Invocazione (2) 1°chiamata da (1)

PERM(A,1)

codice

1)If(k=n) Controllo (A); else{

2)for(int i=k;i<n;i++){

3)SWAP(A[i],A[k]);

4)PERM(A,K+1);

5)SWAP(A[i],A[k]);}}

Istr. k i A

1 1 a b c

2 1 1 a b c

3 1 1 a b c

4 1 1 a b c

2 1 2 a b c

3 1 2 a c b

4 1 2 a c b

5 1 2 a b c 2 1 3 a b c

5

Fine secondo ciclo di for

Incremento di i, uscita dal for e ritorno a Invocazione (1)

1

Page 13: 1 Automazione dellalgoritmo ricorsivo di permutazione eseguita da Mariano Melchiorri.

13

PERM(Char []A,int K)

Invocazione (1) A={a,b,c}; n=A.length=3

PERM(A,0)

codice

1)If(k=n) Controllo (A); else{

2)for(int i=k;i<n;i++);

3)SWAP(A[i],A[k]);

4)PERM(A,K+1);

5)SWAP(A[i],A[k]);}

Istr. k i A

1 0 a b c2 0 0 a b c3 0 0 a b c4 0 0 a b c5 0 0 a b c2 0 1 a b c3 0 1 b a c4 0 1 b a c

Fine primo ciclo for

2

2° chiamata ricorsiva da (1)Invocazione (7)

7

Page 14: 1 Automazione dellalgoritmo ricorsivo di permutazione eseguita da Mariano Melchiorri.

14

PERM(Char []A,int K)

Invocazione (7) 2°chiamata da (1)

PERM(A,1)

codice

1)If(k=n) Controllo (A); else{

2)for(int i=k;i<n;i++);

3)SWAP(A[i],A[k]);

4)PERM(A,K+1);

5)SWAP(A[i],A[k]);}

Istr. k i A

1 1 b a c2 1 1 b a c3 1 1 b a c4 1 1 b a c

1° chiamata ricorsiva da (7)

Invocazione (8)

8

Page 15: 1 Automazione dellalgoritmo ricorsivo di permutazione eseguita da Mariano Melchiorri.

15

PERM(Char []A,int K)

Invocazione (8) 1°chiamata da (7)

PERM(A,2)

codice

1)If(k=n) Controllo (A); else{

2)for(int i=k;i<n;i++);

3)SWAP(A[i],A[k]);

4)PERM(A,K+1);

5)SWAP(A[i],A[k]);}

Istr. k i A

1 2 b a c2 2 2 b a c3 2 2 b a c4 2 2 b a c

1° chiamata ricorsiva da (8)

Invocazione (9)

9

Page 16: 1 Automazione dellalgoritmo ricorsivo di permutazione eseguita da Mariano Melchiorri.

16

PERM(Char []A,int K)

Invocazione (9) 1°chiamata da (3)

PERM(A,3)

codice

1)If(k=n) Controllo (A); else{

2)for(int i=k;i<n;i++);

3)SWAP(A[i],A[k]);

4)PERM(A,K+1);

5)SWAP(A[i],A[k]);}

Istr. k i A

1 3 b a c

Chiamata Controllo(A) e uscita con ritorno a Invocazione (8)

8

Permutazione b a c

Page 17: 1 Automazione dellalgoritmo ricorsivo di permutazione eseguita da Mariano Melchiorri.

17

PERM(Char []A,int K)

Invocazione (8) 1°chiamata da (7)

PERM(A,2)

codice

1)If(k=n) Controllo (A); else{

2)for(int i=k;i<n;i++);

3)SWAP(A[i],A[k]);

4)PERM(A,K+1);

5)SWAP(A[i],A[k]);}

Istr. k i A

1 2 b a c2 2 2 b a c3 2 2 b a c4 2 2 b a c5 2 2 b a c2 2 3 b a cFine primo ciclo di for

Incremento di i, uscita dal for e ritorno a Invocazione (7)

9

7

Page 18: 1 Automazione dellalgoritmo ricorsivo di permutazione eseguita da Mariano Melchiorri.

18

PERM(Char []A,int K)

Invocazione (7) 2°chiamata da (1)

PERM(A,1)

codice

1)If(k=n) Controllo (A); else{

2)for(int i=k;i<n;i++){

3)SWAP(A[i],A[k]);

4)PERM(A,K+1);

5)SWAP(A[i],A[k]);}}

Istr. k i A

1 1 b a c2 1 1 b a c3 1 1 b a c4 1 1 b a c2 1 2 b a c3 1 2 b c a4 1 2 b c a2° chiamata ricorsiva da (7)

Invocazione (10)

8

10

Page 19: 1 Automazione dellalgoritmo ricorsivo di permutazione eseguita da Mariano Melchiorri.

19

PERM(Char []A,int K)

Invocazione (10) 2°chiamata da (7)

PERM(A,2)

codice

1)If(k=n) Controllo (A); else{

2)for(int i=k;i<n;i++){

3)SWAP(A[i],A[k]);

4)PERM(A,K+1);

5)SWAP(A[i],A[k]);}}

Istr. k i A

1 2 b c a2 2 2 b c a3 2 2 b c a4 2 2 b c a

1° chiamata ricorsiva da (10)Invocazione (11)

11

Page 20: 1 Automazione dellalgoritmo ricorsivo di permutazione eseguita da Mariano Melchiorri.

20

PERM(Char []A,int K)

Invocazione (11) 1°chiamata da (10)

PERM(A,3)

codice

1)If(k=n) Controllo (A); else{

2)for(int i=k;i<n;i++){

3)SWAP(A[i],A[k]);

4)PERM(A,K+1);

5)SWAP(A[i],A[k]);}}

Istr. k i A

1 3 b c a

Chiamata Controllo(A) e uscita con ritorno a Invocazione (10)

10

Permutazione b c a

Page 21: 1 Automazione dellalgoritmo ricorsivo di permutazione eseguita da Mariano Melchiorri.

21

PERM(Char []A,int K)

Invocazione (10) 2°chiamata da (7)

PERM(A,2)

codice

1)If(k=n) Controllo (A); else{

2)for(int i=k;i<n;i++){

3)SWAP(A[i],A[k]);

4)PERM(A,K+1);

5)SWAP(A[i],A[k]);}}

Istr. k i A

1 2 b c a2 2 2 b c a3 2 2 b c a4 2 2 b c a5 2 2 b c a2 2 3 b c a

11

7Incremento di i, uscita dal for e ritorno a Invocazione (7)

Page 22: 1 Automazione dellalgoritmo ricorsivo di permutazione eseguita da Mariano Melchiorri.

22

PERM(Char []A,int K)

Invocazione (7) 2°chiamata da (1)

PERM(A,1)

codice

1)If(k=n) Controllo (A); else{

2)for(int i=k;i<n;i++){

3)SWAP(A[i],A[k]);

4)PERM(A,K+1);

5)SWAP(A[i],A[k]);}}

Istr. k i A

1 1 b a c

2 1 1 b a c

3 1 1 b a c

4 1 1 b a c

2 1 2 b a c

3 1 2 b c a

4 1 2 b c a

5 1 2 b a c 2 1 3 b a c

10

Fine secondo ciclo di for

Incremento di i, uscita dal for e ritorno a Invocazione (1)

1

Page 23: 1 Automazione dellalgoritmo ricorsivo di permutazione eseguita da Mariano Melchiorri.

23

PERM(Char []A,int K)

Invocazione (1) A={a,b,c}; n=A.length=3

PERM(A,0)

codice

1)If(k=n) Controllo (A); else{

2)for(int i=k;i<n;i++);

3)SWAP(A[i],A[k]);

4)PERM(A,K+1);

5)SWAP(A[i],A[k]);}

Istr. k i A

1 0 a b c

2 0 0 a b c

3 0 0 a b c

4 0 0 a b c

5 0 0 a b c

2 0 1 a b c

3 0 1 b a c

4 0 1 b a c

5 0 1 a b c

2 0 2 a b c

3 0 2 c b a

4 0 2 c b a

Fine secondo ciclo for

7

3° chiamata ricorsiva da (1)Invocazione (12) 12

Page 24: 1 Automazione dellalgoritmo ricorsivo di permutazione eseguita da Mariano Melchiorri.

24

PERM(Char []A,int K)

Invocazione (12) 3°chiamata da (1)

PERM(A,1)

codice

1)If(k=n) Controllo (A); else{

2)for(int i=k;i<n;i++);

3)SWAP(A[i],A[k]);

4)PERM(A,K+1);

5)SWAP(A[i],A[k]);}

Istr. k i A

1 1 c b a2 1 1 c b a3 1 1 c b a4 1 1 c b a

1° chiamata ricorsiva da (12)

Invocazione (13)

13

Page 25: 1 Automazione dellalgoritmo ricorsivo di permutazione eseguita da Mariano Melchiorri.

25

PERM(Char []A,int K)

Invocazione (13) 1°chiamata da (12)

PERM(A,2)

codice

1)If(k=n) Controllo (A); else{

2)for(int i=k;i<n;i++);

3)SWAP(A[i],A[k]);

4)PERM(A,K+1);

5)SWAP(A[i],A[k]);}

Istr. k i A

1 2 c b a2 2 2 c b a3 2 2 c b a4 2 2 c b a

1° chiamata ricorsiva da (13)

Invocazione (14)

14

Page 26: 1 Automazione dellalgoritmo ricorsivo di permutazione eseguita da Mariano Melchiorri.

26

PERM(Char []A,int K)

Invocazione (14) 1°chiamata da (13)

PERM(A,3)

codice

1)If(k=n) Controllo (A); else{

2)for(int i=k;i<n;i++);

3)SWAP(A[i],A[k]);

4)PERM(A,K+1);

5)SWAP(A[i],A[k]);}

Istr. k i A

1 3 c b a

Chiamata Controllo(A) e uscita con ritorno a Invocazione (13)

13

Permutazione c b a

Page 27: 1 Automazione dellalgoritmo ricorsivo di permutazione eseguita da Mariano Melchiorri.

27

PERM(Char []A,int K)

Invocazione (13) 1°chiamata da (12)

PERM(A,2)

codice

1)If(k=n) Controllo (A); else{

2)for(int i=k;i<n;i++);

3)SWAP(A[i],A[k]);

4)PERM(A,K+1);

5)SWAP(A[i],A[k]);}

Istr. k i A

1 2 c b a2 2 2 c b a3 2 2 c b a4 2 2 c b a5 2 2 c b a2 2 3 c b aFine primo ciclo di for

Incremento di i, uscita dal for e ritorno a Invocazione (12)

14

12

Page 28: 1 Automazione dellalgoritmo ricorsivo di permutazione eseguita da Mariano Melchiorri.

28

PERM(Char []A,int K)

Invocazione (12) 3°chiamata da (1)

PERM(A,1)

codice

1)If(k=n) Controllo (A); else{

2)for(int i=k;i<n;i++){

3)SWAP(A[i],A[k]);

4)PERM(A,K+1);

5)SWAP(A[i],A[k]);}}

Istr. k i A

1 1 c b a2 1 1 c b a3 1 1 c b a4 1 1 c b a5 1 1 c b a2 1 2 c b a3 1 2 c a b4 1 2 c a b

2° chiamata ricorsiva da (12)Invocazione (15)

13

15

Page 29: 1 Automazione dellalgoritmo ricorsivo di permutazione eseguita da Mariano Melchiorri.

29

PERM(Char []A,int K)

Invocazione (15) 2°chiamata da (12)

PERM(A,2)

codice

1)If(k=n) Controllo (A); else{

2)for(int i=k;i<n;i++){

3)SWAP(A[i],A[k]);

4)PERM(A,K+1);

5)SWAP(A[i],A[k]);}}

Istr. k i A

1 2 c a b2 2 2 c a b3 2 2 c a b4 2 2 c a b

1° chiamata ricorsiva da (15)Invocazione (16)

16

Page 30: 1 Automazione dellalgoritmo ricorsivo di permutazione eseguita da Mariano Melchiorri.

30

PERM(Char []A,int K)

Invocazione (16) 1°chiamata da (15)

PERM(A,3)

codice

1)If(k=n) Controllo (A); else{

2)for(int i=k;i<n;i++){

3)SWAP(A[i],A[k]);

4)PERM(A,K+1);

5)SWAP(A[i],A[k]);}}

Istr. k i A

1 3 c a b

Chiamata Controllo(A) e uscita con ritorno a Invocazione (15)

15

Permutazione c a b

Page 31: 1 Automazione dellalgoritmo ricorsivo di permutazione eseguita da Mariano Melchiorri.

31

PERM(Char []A,int K)

Invocazione (15) 2°chiamata da (12)

PERM(A,2)

codice

1)If(k=n) Controllo (A); else{

2)for(int i=k;i<n;i++){

3)SWAP(A[i],A[k]);

4)PERM(A,K+1);

5)SWAP(A[i],A[k]);}}

Istr. k i A

1 2 c a b2 2 2 c a b3 2 2 c a b4 2 2 c a b5 2 2 c a b2 2 2 c a b

16

12

Incremento di i, uscita dal for e ritorno a Invocazione (12)

Page 32: 1 Automazione dellalgoritmo ricorsivo di permutazione eseguita da Mariano Melchiorri.

32

PERM(Char []A,int K)

Invocazione (12) 3°chiamata da (1)

PERM(A,1)

codice

1)If(k=n) Controllo (A); else{

2)for(int i=k;i<n;i++){

3)SWAP(A[i],A[k]);

4)PERM(A,K+1);

5)SWAP(A[i],A[k]);}}

Istr. k i A

1 1 c b a

2 1 1 c b a

3 1 1 c b a

4 1 1 c b a

2 1 2 c b a

3 1 2 c a b

4 1 2 c a b

5 1 2 c b a2 1 3 c b a

15

Fine secondo ciclo di for

Incremento di i, uscita dal for e ritorno a Invocazione (1)

1

Page 33: 1 Automazione dellalgoritmo ricorsivo di permutazione eseguita da Mariano Melchiorri.

33

PERM(Char []A,int K)

Invocazione (1) A={a,b,c}; n=A.length=3

PERM(A,0)

codice

1)If(k=n) Controllo (A); else{

2)for(int i=k;i<n;i++);

3)SWAP(A[i],A[k]);

4)PERM(A,K+1);

5)SWAP(A[i],A[k]);}

Istr.

k i A

1 0 a b c

2 0 0 a b c

3 0 0 a b c

4 0 0 a b c

5 0 0 a b c

2 0 1 a b c

3 0 1 b a c

4 0 1 b a c

5 0 1 a b c

2 0 2 a b c

3 0 2 c b a

4 0 2 c b a

5 0 2 a b c

2 0 3

Fine terzo ciclo for

12Fine esecuzione