1 Automazione dellalgoritmo ricorsivo di permutazione eseguita da Mariano Melchiorri.

Slides:



Advertisements
Presentazioni simili
Esercitazioni If nidificati
Advertisements

Uso avanzato di C.
Programma: main() { istruzioni } ; assegnazione condizione ciclo istruzione: ;
Nel C non esiste un dato primario di tipo stringa; queste sono rappresentate con un array monodimensionale di caratteri (tipo char). Così per definire.
if (condizione.) { blocco_istruzioni } else
© 2007 SEI-Società Editrice Internazionale, Apogeo Unità F2 Selezione.
Ricorsione Procedure e funzioni ricorsive. Definizioni Un oggetto si dice ricorsivo se è definito totalmente o parzialmente in termini di sé stesso La.
Selezione multipla e tipo di dato carattere
Selezione - approfondimento
1 Informatica Generale Susanna Pelagatti Ricevimento: Mercoledì ore presso Dipartimento di Informatica, Via Buonarroti,
QUICKSORT … un breve ripasso!
Dallalgoritmo minimax allalgoritmo alfa-beta. MINIMAX int minimax(stato, livello) { if((livello == max_livello) || condizione_uscita(stato)) { CAMMINO.
La ricorsione Simulazione. Il Main /* Programma che usa una funzione ricorsiva*/ #include #define MAX_N 8 main() int valore, dato; printf(Introduci n:
ESERCITAZIONE N. 5 ESERCIZIO N. 1 Autore: Biagio Brattoli S I Corso.
Capitolo 4 Ordinamento Algoritmi e Strutture Dati.
Informatica B Allievi Elettrici AA La progettazione per raffinamenti successivi.
Tail recursion: esempio
Informatica di base A.A. 2003/2004 Algoritmi e programmi
Informatica 2. Concetti fondamentali di programmazione Programmare vuol dire scrivere un algoritmo in un linguaggio che faccia funzionare un calcolatore.
Algoritmi e strutture Dati - Lezione 7
Laboratorio di Linguaggi lezione III: tipi base, espressioni, type-cast Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e.
Corso di Laurea in Biotecnologie Informatica (Programmazione)
INTRODUZIONE ALLA PROGRAMMAZIONE STRUTTURATA
CORSO DI PROGRAMMAZIONE II
Algoritmi e Strutture Dati Valutazione del tempo di esecuzione degli algoritmi.
Le strutture di controllo
INFORMATICA GRAFICA – SSD ING-INF/05 Sistemi di elaborazione delle informazioni a.a. 2007/2008 Argomenti avanzati OpenGL Graphics.
APPUNTI SUL LINGUAGGIO C
Selezione (=scelta) con “if-else”
INFORMATICA Esercizi.
9) If e else. Lab.Calc.I AA2002/03 - cap.92 espressione.
10) switch, else if e ifdef. Lab.Calc.I AA2002/03 - cap.102 espressione condizione.
Istruzioni di selezione (If/else/switch)
Esercizio: Copiare un file in un nuovo file mediante le funzioni read e write.
Strutture di controllo nel C
Esercizi FUNZIONI Passaggio di parametri per valore, variabili e tipi locali e globali, prototipo.
Esercizi C sui tipi definiti dall’utente
Politecnico di Milano Esercizi Preparazione alla prima prova intermedia.
La Programmazione Ricorsiva
Lezione XII Laboratorio di Programmazione. Eccezioni Per la gestione di operazioni che possono non andare a buon fine il C++ mette a disposizione un sistema.
ESERCIZIO: la Torre di Hanoi
TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P.
Algoritmi e Strutture Dati
Programmazione di Calcolatori
void binario(int n); …………………
Tail recursion: esempio
Esercizi La distanza di hamming tra due interi x e y si definisce come il numero di posizioni nella rappresentazione binaria di x e y aventi bit differenti.
Ricerca sequenziale in un array di interi
Corso di Programmazione Grafica e Laboratorio Daniele Marini
Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni – BCOR Ingegneria Elettronica – BELR Introduzione al C Esercitazione 5 D. Bloisi, A.
Ripetizione La vera potenza dei programmi per computer risiede nella capacità di ripetere lo stesso calcolo o sequenza di istruzioni più volte, ogni volta.
Esercitazioni su liste
#include void main() { int a,b,c,; float s, x,x1,x2,delta,alfa,beta; int num[3]; int i; printf("La forma classica dell'equazione di 2° grado è: a*x^2+b*x+c=0\n.
Flusso Statico e Dinamico 20/03/2006. Codice da Interpretare int valore; valore = funz(); if( valore > 0 ) { [codice1] } else { [codice2] } return valore;
Informatica B Allievi Elettrici - AA Fondamenti della programmazione in linguaggio C (II) Istruzioni e strutture di controllo.
Definizione di algoritmo: Un algoritmo è un procedimento che risolve un determinato problema attraverso un numero finito di passi. Un problema risolvibile.
Informatica 4 Funzioni. FUNZIONE: definizione MATEMATICA Relazione (o applicazione) binaria tra due insiemi A e B che associa a ogni elemento di A un.
TECNICA DIVIDE ET IMPERA
Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 8 Oggetti statici e dinamici. Classi annidate. Costruttori/distruttori.
In grado di effettuare molte azioni elementari indipendenti automa universale generatore di sequenze riconoscitore di sequenze circuiti sequenziali sommatore.
Case Study - Un (linguaggio) costrutto tipato: Accedere indirizzi fuori dai bounds di un array Char A[n1..n2]; Int i; … i = e … … A[i] … Sono due interi.
Linguaggio C: Le basi Stefano Cagnoni e Monica Mordonini
Ingegneria del software Modulo 1 - Introduzione al processo software Unità didattica 5 -Test e verifica Ernesto Damiani Università degli Studi di Milano.
Linguaggio C: Le basi Stefano Cagnoni e Monica Mordonini
Informatica 4 La ricorsione. Definizione di ricorsione Ricorsione è la proprietà di quei programmi che, all’interno delle istruzioni che li compongono,
Stringhe In linguaggio C. Stringhe  Un insieme di caratteri in sequenza forma una stringa.  Alcuni linguaggi definiscono per le stringhe uno specifico.
Quick sort void quick_sort (int a[],int l, int r) { int i, j,v, t; if (r>l) { v=a[r];//L’elemento “pivot” è quello più a dx i=l-1; j=r; // i scorre da.
comprensione e modifica di codice
comprensione e modifica di codice
Dalla programmazione tradizionale al paradigma OO
Transcript della presentazione:

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 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 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 ° chiamata ricorsiva da (1) Invocazione (2) 2

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 ° chiamata ricorsiva da (2) Invocazione (3) 3

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 ° chiamata ricorsiva da (3) Invocazione (4) 4

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 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 Fine primo ciclo di for Incremento di i, uscita dal for e ritorno a Invocazione (2) 4 2

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 a c b ° chiamata ricorsiva da 2 Invocazione (5) 3 5

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 ° chiamata ricorsiva da (5) Invocazione (6) 6

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 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 Incremento di i, uscita dal for e ritorno a Invocazione (2)

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 a c b a b c Fine secondo ciclo di for Incremento di i, uscita dal for e ritorno a Invocazione (1) 1

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 b a c 4 01 Fine primo ciclo for 2 2° chiamata ricorsiva da (1) Invocazione (7) 7

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 ° chiamata ricorsiva da (7) Invocazione (8) 8

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 ° chiamata ricorsiva da (8) Invocazione (9) 9

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 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 Fine primo ciclo di for Incremento di i, uscita dal for e ritorno a Invocazione (7) 9 7

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 b c a ° chiamata ricorsiva da (7) Invocazione (10) 8 10

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 ° chiamata ricorsiva da (10) Invocazione (11) 11

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 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 Incremento di i, uscita dal for e ritorno a Invocazione (7)

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 b c a b a c Fine secondo ciclo di for Incremento di i, uscita dal for e ritorno a Invocazione (1) 1

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 b a c a b c c b a 402 Fine secondo ciclo for 7 3° chiamata ricorsiva da (1) Invocazione (12) 12

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 ° chiamata ricorsiva da (12) Invocazione (13) 13

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 ° chiamata ricorsiva da (13) Invocazione (14) 14

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 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 Fine primo ciclo di for Incremento di i, uscita dal for e ritorno a Invocazione (12) 14 12

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 c a b ° chiamata ricorsiva da (12) Invocazione (15) 13 15

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 ° chiamata ricorsiva da (15) Invocazione (16) 16

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 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 Incremento di i, uscita dal for e ritorno a Invocazione (12)

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 c a b c b a Fine secondo ciclo di for Incremento di i, uscita dal for e ritorno a Invocazione (1) 1

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 b a c a b c c b a a b c 203 Fine terzo ciclo for 12 Fine esecuzione