Algoritmo iterativo: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
m Fix link
fix
 
(19 versioni intermedie di 16 utenti non mostrate)
Riga 1:
{{F|programmazione|febbraio 2013}}
Dicesi '''algoritmo iterativo''' un [[algoritmo]] costituito da una sequenza di azioni che viene ripetuta, finché è necessaria la ripetizione stessa (un [[ciclo]]). Tutte le operazioni che richiedono la ripetizione di una stessa azione più volte, ma in numero [[finito]] sono dette procedure iterative. Ad ogni [[iterazione]], l'[[esecutore]] svolge un compito. Al termine verifica se tale compito vada ripetuto mediante una ''condizione di ripetizione''.
 
DicesiUn '''algoritmo iterativo''' unè una tipologia di [[algoritmo]] costituito da una sequenza di azioni che viene ripetuta, finché è necessaria la ripetizione stessa (un [[ciclo]]). Tutte le operazioni che richiedono la ripetizione di una stessa azione più volte, ma in numero [[Infinito (matematica)|finito]] sono dette procedure iterative. Ad ogni [[iterazione]], l'[[esecutore]] svolge un compito. Al termine verifica se tale compito vada ripetuto mediante una ''condizione di ripetizione''.
== Esempio della catena di montaggio ==
Per spiegare meglio il concetto di algoritmo iterativo, si consideri il lavoro di un addetto ad una [[catena di montaggio]]: egli deve eseguire le stesse azioni ripetutamente finché ci sono pezzi da [[assemblaggio|assemblare]]. L'algoritmo iterativo della catena di montaggio può essere così descritto:
 
== Esempio della catena di montaggio ==
1. Preleva i componenti
Per spiegare meglio il concetto di algoritmo iterativo, si consideri il lavoro di un addetto ad una [[catena di montaggio]]: egli deve eseguire le stesse azioni ripetutamente finché ci sono pezzi da [[assemblaggio|assemblare]]. L'algoritmo iterativo della catena di montaggio può essere così descritto:
2. Assembla i componenti
3.# PassaPreleva i componenti al collega
1.# PrelevaAssembla i componenti
4. Se ci sono altri componenti da assemblare, torna al punto 1
# Passa i componenti al collega
4.# Se ci sono altri componenti da assemblare, torna al punto 1
 
== Utilizzo delle iterazioni nei linguaggi di programmazione ==
Per rendere agevole l'implementazione di procedure iterative nei [[linguaggio di programmazione|linguaggi di programmazione]] di alto livello, sono disponibili due fondamentali costrutti: ''for'' e ''while''. Il primo si presta ai cicli enumerativi (ossia quelli in cui il numero di iterazioni è prestabilito o dipende da un valore numerico calcolato prima dell'iterazione), mentre il secondo permette una libera applicazione della condizione di iterazione.
 
A tal proposito vanno fatte alcune importanti distinzioni sintattiche tra i linguaggi della famiglia [[Linguaggio C|C]] (con l'aggiunta di [[Java (linguaggio di programmazione)|Java]]) e il linguaggio [[Visual Basic]]. Affrontiamo separatamente le [[sintassi]] dei suddetti costrutti nei due casi
 
=== Famiglia C ===
Riga 25 ⟶ 26:
for (istruzione iniziale; condizione di iterazione; istruzione di fine ciclo) [istruzione di iterazione];
 
a seconda del fatto che una iterazione preveda una o più istruzioni.

Il funzionamento è il seguente:
# Viene eseguita l'istruzione iniziale
# Viene eseguito il blocco iterativo
# Viene eseguita l'istruzione di fine ciclo
# Se la condizione di iterazione è ''[[Algebra di Boole|vera]]'' viene ripetuto il ciclo, quindi si torna alla verifica della condizione
# Se la condizione di iterazione è ''falsa'' si esce dal ciclo
 
La definizione di cui sopra permette di utilizzare un ciclo for con qualunque tipo di condizione. Tuttavia tale ciclo si presta per algoritmi enumerativi. Ad esempio, il seguente codice [[C++]] scrive a video, elemento per elemento, gli elementi di un [[array]]:
Riga 49 ⟶ 52:
 
La differenza tra i costrutti è tanto semplice quanto sostanziale:
* While verifica la condizione: se è vera esegue il ciclo finché la condizione non diventerà falsa
* Do... While esegue la prima iterazione, e poi si comporta come il precedente
 
Do...While è dunque particolarmente indicato quando si ha a che fare con [[Struttura dati|strutture dati]] dalle quali i dati da verificare devono prima essere estratti tramite una chiamata a funzione.
 
Ad esempio, posto di avere una classe di tipo [[Pila (informatica)|Stack]] ''MyStack'', contenente oggetti di tipo ''MyObj'', vogliamo scrivere a video il contenuto degli oggetti fino a trovare un particolare elemento terminatore, posotposto che lo stack non sia mai vuoto (es. il [[Costruttore (informatica)|costruttore]] inizializza lo stack col terminatore e la pop non lo elimina comunque). Il seguente codice richiede il ciclo do...while
 
char TERMINATOR = '\0';
Riga 66 ⟶ 69:
} while (Objstr != TERMINATOR);
 
Nei linguaggi C è possibile controllare la sequenza dinamica dei cicli iterativi mediante due istruzioni in grado rispettivamente di saltare alla prossima iterazione o interrompere del tutto il ciclo. Tali istruzioni sono '''continue''' e '''break'''. Ad esempio il seguente codice mostra i primi 5 [[file eseguibile|file eseguibili]] di una [[directory]], memorizzata come array di [[stringa (informatica)|stringhe]]. Nell'esempio non si tiene conto di estensioni multiple (es. ''.exe.bak'')
 
k = 0;
for (i = 0; 0 < count(dir); i++) {
if (!strpos(".exe",dir[i])) continue;
if (k == 5) break;
cout « dir[i] « endl;
k++;
Riga 85 ⟶ 88:
Next
 
La variabile ''contatore'' deve essere di tipo numerico, i valori ''iniziale'' e ''finale'' possono essere anche funzioni che restituiscono un intero. Lo step è un valore opzionale che indica l'entità dell'incremento/decremento, che di ''[[default (informatica)|default]]'' è 1 (o -1). L'esecutore riconosce dinamicamente, a ''[[runtime]]'', se il ciclo deve essere incrementativoincrementale o decrementativodecrementale confrontando i valori iniziale e finale.
 
Analogamente ai linguaggi C è possibile utilizzare un ciclo ''Do... Loop'' in quattro diverse versioni
Riga 96 ⟶ 99:
[istruzioni]
While [condizione]
Le altre due si ottengono sostuendosostituendo a ''While'' il termine ''Until''
 
* La prima sintassi verifica che la condizione sia ''vera'' prima di procedere
* La seconda esegue la prima iterazione e poi verifica che la condizione sia ''vera''
* La terza e la quarta, analogamente con le precedenti, proseguono solo se la condizione è ''falsa''
 
== Iterazioni nei linguaggi assemblativi ==
InNei linguaggi [[assembly]] tradizionali non sono disponibili costrutti iterativi., Questoin perchéquanto le primitive disponibili a livello macchina non li prevedono; le iterazioni sono essiinfatti collidonorappresentate conattraverso ilistruzioni concettoesplicite di semplicitàsalto dela linguaggioun'istruzione assemblativoprecedente. Per realizzare un ciclo ''for'' con istruzioni assemblative si parte dall'esempio della catena di montaggio, e si realizza il codice strutturandolo nel seguente modo:
 
# Si etichettano il punto di inizio ciclo (''START'') e la prima istruzione dopo il ciclo (''END'')
# Eventuali istruzioni pre-iterazione vanno prima della label ''START''
# Istruzioni '''break''' corrispondono ad un salto incondizionato (JMP) a ''END''
# Istruzioni '''continue''' corrispondono ad un salto incondizionato (JMP) a ''START''
# Si implementa la condizione di iterazione su ''START'', implementando un algoritmo di confronto tale che se la condizione è ''falsa'' si salta subito a END
# Si implementa tutto l'algoritmo dell'iterazione
# Si fa un salto incondizionato a ''START''
 
== Voci correlate ==
* [[Algoritmo ricorsivo]]
 
{{Portale|Informatica}}
 
[[Categoria:Algoritmi|Iterativo]]
[[Categoria:Equazioni funzionali]]
 
[[es:Algoritmo iterativo]]