Ciclo while
In questa pagina 4
In questa pagina 5
Sintassi e semantica
Definizione (ciclo while)
while condizione: corpoLa condizione viene valutata prima di ogni iterazione; se è falsa all'inizio il corpo non viene mai eseguito. Il corpo deve modificare qualcosa da cui dipende la condizione, altrimenti il ciclo è infinito.
Esempio. n = 3 seguito da while n > 0: n -= 1 esegue il corpo volte e termina con n == 0.
Python non ha do ... while: si ottiene con while True + break (vedi sotto). In C esiste: Tipi, operatori e controllo del flusso in CTipi interi e reali del C con dimensioni e limiti, conversioni implicite e cast, divisione intera, operatori di incremento, logici e bit a bit; if, switch, while, do-while, for, break e continue.Tipi, operatori e controllo del flusso in C →.
Schemi tipici
Controllato da contatore (numero di iterazioni noto; di solito si preferisce for, vedi Ciclo for e rangefor scorre gli elementi di un iterabile; range per gli indici; enumerate, zip, reversed, sorted; cicli annidati; quando usare for e quando while.Ciclo for e range →):
i = 0
while i < 10:
print(i)
i += 1Controllato da condizione (numero di iterazioni non noto a priori):
# numero di cifre di n > 0
cifre = 0
while n > 0:
n //= 10
cifre += 1# algoritmo di Euclide per il MCD
while b != 0:
a, b = b, a % b
# ora a è il MCDSentinella (si legge finché arriva un valore speciale):
somma = 0
x = int(input("numero (0 per finire): "))
while x != 0:
somma += x
x = int(input("numero (0 per finire): "))Validazione dell'input (schema "ripeti finché valido", equivalente a un do-while):
while True:
eta = int(input("età: "))
if eta >= 0:
break
print("valore non valido")Definizione (break, continue ed else nei cicli). ## break, continue, else
break: esce subito dal ciclo più interno.continue: salta il resto del corpo e torna al controllo della condizione.elsedopo il ciclo: eseguito se il ciclo termina senzabreak(tipico nelle ricerche).
Esempio. Con n = 15 il ciclo trova d = 3 ed esce con break stampando 15 non è primo; con n = 13 termina senza break ed esegue l'else.
d = 2
while d * d <= n:
if n % d == 0:
print(n, "non è primo")
break
d += 1
else:
print(n, "è primo") # nessun divisore trovato (per n >= 2)Correttezza: terminazione e invariante
Proprietà (terminazione e invariante di un ciclo)
- Terminazione: si individua una quantità intera non negativa che diminuisce a ogni iterazione (in Euclide:
b, perchéa % b < b).- Invariante di ciclo: proprietà vera prima e dopo ogni iterazione; alla fine, insieme alla condizione falsa, dà il risultato. Nel ciclo della somma con sentinella: "
sommaè la somma dei valori letti finora, escluso l'ultimo".
Esempio. Con while b != 0: a, b = b, a % b da (48, 18) si passa a (18, 12), (12, 6), (6, 0): b decresce sempre e a finale vale 6, il MCD.
Ragionare per invarianti aiuta a scrivere e a correggere i cicli (vedi Pattern algoritmici iterativiSchemi ricorrenti nei cicli: accumulatore, contatore, massimo e minimo, ricerca con uscita anticipata, verifica universale, filtro e trasformazione, finestra scorrevole, due indici, elaborazione di coppie.Pattern algoritmici iterativi →).
Errori tipici
- Dimenticare l'aggiornamento della variabile di controllo (ciclo infinito: si interrompe con Ctrl+C).
- Errore di uno (off-by-one):
<al posto di<=o viceversa. Verificare a mano il primo e l'ultimo giro. - Variabile della condizione non inizializzata prima del ciclo (
NameError).
Versione ripasso
Sintassi e semantica
while condizione:
corpoLa condizione è valutata prima di ogni iterazione; se falsa dall'inizio, il corpo non viene eseguito. Il corpo deve modificare le variabili della condizione per evitare cicli infiniti. Manca il do ... while: si simula con while True e break.
Schemi tipici
- Contatore (ripetizioni note, preferire Ciclo for e rangefor scorre gli elementi di un iterabile; range per gli indici; enumerate, zip, reversed, sorted; cicli annidati; quando usare for e quando while.Ciclo for e range →):
i = 0
while i < 10:
print(i)
i += 1- Condizione (ripetizioni non note, es. MCD con Euclide):
while b != 0:
a, b = b, a % b- Sentinella (lettura finché arriva un valore speciale).
- Validazione input (schema ripeti finché valido):
while True:
eta = int(input("età: "))
if eta >= 0:
break
print("valore non valido")break, continue, else
break: esce dal ciclo più interno.continue: salta al controllo della condizione.else: eseguito se il ciclo termina senzabreak(es. ricerca di numeri primi).
Correttezza: terminazione e invariante
- Terminazione: individuare una quantità intera non negativa che decresce a ogni iterazione (es.
bin Euclide). - Invariante di ciclo: proprietà vera prima e dopo ogni iterazione, fondamentale per Pattern algoritmici iterativiSchemi ricorrenti nei cicli: accumulatore, contatore, massimo e minimo, ricerca con uscita anticipata, verifica universale, filtro e trasformazione, finestra scorrevole, due indici, elaborazione di coppie.Pattern algoritmici iterativi →.
Errori tipici
Dimenticare l'aggiornamento della variabile di controllo (ciclo infinito); errori off-by-one (< vs <=); variabile di condizione non inizializzata (NameError).