Scaricare la presentazione
La presentazione è in caricamento. Aspetta per favore
PubblicatoGisella Natale Modificato 11 anni fa
1
1 Automazione dellalgoritmo ricorsivo di permutazione eseguita da Mariano Melchiorri
2
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 dellarray A 2.Controllo è la chiamata ad un metodo che visualizza le permutazioni di A 3.SWAP è la chiamata ad un metodo che scambia i valori degli elementi passati come parametro attuale Nelle diapositive successive è riportato lo stato degli indici k e i allinterno di ogni chiamata durante lesecuzione del corpo del metodo.
3
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.kiA 1 0a b c 2 00 3 00 4 00 1° chiamata ricorsiva da (1) Invocazione (2) 2
4
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.kiA 1 1a b c 2 11 3 11 4 11 1° chiamata ricorsiva da (2) Invocazione (3) 3
5
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.kiA 1 2a b c 2 22 3 22 4 22 1° chiamata ricorsiva da (3) Invocazione (4) 4
6
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.kiA 1 3a b c Chiamata Controllo(A) e uscita con ritorno a Invocazione (3) 3 Permutazione a b c
7
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.kiA 1 2a b c 2 22 3 22 4 22 5 22 2 23 Fine primo ciclo di for Incremento di i, uscita dal for e ritorno a Invocazione (2) 4 2
8
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.kiA 1 1a b c 2 11 3 11 4 11 5 11 2 12 3 12a c b 4 12 2° chiamata ricorsiva da 2 Invocazione (5) 3 5
9
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.kiA 1 2a c b 2 22 3 22 4 22 1° chiamata ricorsiva da (5) Invocazione (6) 6
10
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.kiA 1 3a c b Chiamata Controllo(A) e uscita con ritorno a Invocazione (5) 5 Permutazione a c b
11
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.kiA 1 2a c b 2 22 3 22 4 22 5 22 2 23 6 2 Incremento di i, uscita dal for e ritorno a Invocazione (2)
12
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.kiA 1 1a b c 2 11 3 11 4 11 2 12 3 12a c b 4 12 5 12a b c 2 13 5 Fine secondo ciclo di for Incremento di i, uscita dal for e ritorno a Invocazione (1) 1
13
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.kiA 1 0a b c 2 00 3 00 4 00 5 00 2 01 3 01b a c 4 01 Fine primo ciclo for 2 2° chiamata ricorsiva da (1) Invocazione (7) 7
14
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.kiA 1 1b a c 2 11 3 11 4 11 1° chiamata ricorsiva da (7) Invocazione (8) 8
15
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.kiA 1 2b a c 2 22 3 22 4 22 1° chiamata ricorsiva da (8) Invocazione (9) 9
16
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.kiA 1 3b a c Chiamata Controllo(A) e uscita con ritorno a Invocazione (8) 8 Permutazione b a c
17
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.kiA 1 2b a c 2 22 3 22 4 22 5 22 2 23 Fine primo ciclo di for Incremento di i, uscita dal for e ritorno a Invocazione (7) 9 7
18
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.kiA 1 1b a c 2 11 3 11 4 11 2 12 3 12b c a 4 12 2° chiamata ricorsiva da (7) Invocazione (10) 8 10
19
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.kiA 1 2b c a 2 22 3 22 4 22 1° chiamata ricorsiva da (10) Invocazione (11) 11
20
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.kiA 1 3b c a Chiamata Controllo(A) e uscita con ritorno a Invocazione (10) 10 Permutazione b c a
21
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.kiA 1 2b c a 2 22 3 22 4 22 5 22 2 23 11 7 Incremento di i, uscita dal for e ritorno a Invocazione (7)
22
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.kiA 1 1b a c 2 11 3 11 4 11 2 12 3 12b c a 4 12 5 12b a c 2 13 10 Fine secondo ciclo di for Incremento di i, uscita dal for e ritorno a Invocazione (1) 1
23
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.kiA 10a b c 200 300 400 500 201 301b a c 401 501a b c 202 302c b a 402 Fine secondo ciclo for 7 3° chiamata ricorsiva da (1) Invocazione (12) 12
24
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.kiA 1 1c b a 2 11 3 11 4 11 1° chiamata ricorsiva da (12) Invocazione (13) 13
25
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.kiA 1 2c b a 2 22 3 22 4 22 1° chiamata ricorsiva da (13) Invocazione (14) 14
26
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.kiA 1 3c b a Chiamata Controllo(A) e uscita con ritorno a Invocazione (13) 13 Permutazione c b a
27
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.kiA 1 2c b a 2 22 3 22 4 22 5 22 2 23 Fine primo ciclo di for Incremento di i, uscita dal for e ritorno a Invocazione (12) 14 12
28
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.kiA 1 1c b a 2 11 3 11 4 11 5 11 2 12 3 12c a b 4 12 2° chiamata ricorsiva da (12) Invocazione (15) 13 15
29
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.kiA 1 2c a b 2 22 3 22 4 22 1° chiamata ricorsiva da (15) Invocazione (16) 16
30
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.kiA 1 3c a b Chiamata Controllo(A) e uscita con ritorno a Invocazione (15) 15 Permutazione c a b
31
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.kiA 1 2c a b 2 22 3 22 4 22 5 22 2 22 16 12 Incremento di i, uscita dal for e ritorno a Invocazione (12)
32
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.kiA 1 1c b a 2 11 3 11 4 11 2 12 3 12c a b 4 12 5 12c b a 2 13 15 Fine secondo ciclo di for Incremento di i, uscita dal for e ritorno a Invocazione (1) 1
33
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. kiA 10a b c 200 300 400 500 201 301b a c 401 501a b c 202 302c b a 402 502a b c 203 Fine terzo ciclo for 12 Fine esecuzione
Presentazioni simili
© 2024 SlidePlayer.it Inc.
All rights reserved.