Articles

Programmazione essenziale | Strutture di controllo

Loop

Le “istruzioni di loop” non sono altro che l’automazione di processi multi-fase organizzando sequenze di azioni e raggruppando le parti che devono essere ripetute. Anche una parte centrale della programmazione, l’iterazione (o Looping) dà ai computer gran parte della loro potenza. Possono ripetere una sequenza di passi tutte le volte che è necessario, e ripetizioni appropriate di passi semplici possono risolvere problemi complessi.

In termini generali, ci sono due tipi di “tecniche di Looping”:

  1. “For Loops”: sono quelli che eseguono per un numero prescritto di volte, come controllato da un contatore o un indice.
  2. “While Loops” e “Repeat Loops”: sono basati sull’insorgere e la verifica di una condizione logica. La condizione viene verificata all’inizio o alla fine del costrutto del ciclo.

Diamo un’occhiata:

1) For Loops

In questa struttura di controllo, le istruzioni vengono eseguite una dopo l’altra in un ordine consecutivo su una sequenza di valori che viene valutata solo quando viene avviato il “For Loop” (mai rivalutata). In questo caso, il numero di iterazioni è fisso e noto in anticipo.

For Loop

Se la valutazione della condizione su una variabile (che può assumere valori entro una determinata sequenza) risulta VERA, uno o più statement verranno eseguiti in sequenza su quella stringa di valori. Una volta che il primo test della condizione è fatto (e risulta VERO), l’istruzione viene eseguita e la condizione viene valutata di nuovo, passando attraverso un processo iterativo. La sezione “variabile in sequenza” esegue questo test su ogni valore della sequenza fino a coprire l’ultimo elemento.

Se la condizione non è soddisfatta e il risultato è FALSO (ad esempio la parte “variabile in sequenza” ha finito di passare attraverso tutti gli elementi della sequenza), il ciclo termina. Se il test della condizione risulta FALSO nella prima iterazione, il “For Loop” non viene mai eseguito.

La sintassi di “For Loop” è:

Esempio 1

Per mostrare come funzionano i “For Loop”, prima creeremo una sequenza concatenando diversi nomi di frutta per creare una lista (chiamata “fruit_list”):

Utilizzeremo questa lista di frutta come “sequenza” in un “For Loop”, e faremo in modo che il “For Loop” esegua uno statement una volta (stampa il nome di ogni valore) per ogni valore fornito nella sequenza (i diversi frutti nella lista di frutta):

In questo modo, il risultato del “For Loop” è il seguente:

## "Apple"
## "Kiwi"
## "Orange"
## "Banana"

OK, quindi abbiamo stampato il nome di ogni valore nella lista. Niente di che, giusto? La cosa buona è che i “For Loop” possono essere usati per produrre risultati più interessanti. Date un’occhiata al seguente esempio.

Esempio 2

Che succede se vogliamo modificare dei valori o eseguire dei calcoli in modo sequenziale? Potete usare “For Loops” per eseguire operazioni matematiche in modo sequenziale su ogni valore di un vettore (elementi dello stesso tipo, che in questo caso sarà numerico).

In questo esempio, creeremo una sequenza di numeri (da 1 a 10), e imposteremo un “For Loop” per calcolare e stampare la radice quadrata di ogni valore in quella sequenza:

In questo caso, il risultato del “For Loop” è:

 1
1.414214
1.732051
2
2.236068
2.449490
2.645751
2.828427
3
3.162278

Si può usare qualsiasi tipo di operatore matematico su una sequenza numerica, e come vedremo più avanti in questo articolo, fare ogni sorta di combinazione tra diverse Strutture di Controllo per raggiungere risultati più complessi.

2) While Loops

Nei “While Loops” viene prima valutata una condizione, e se il risultato del test di quella condizione è VERO, una o più istruzioni vengono ripetutamente eseguite finché quella condizione diventa FALSA.

While Loop

A differenza delle “istruzioni If”, in cui una condizione testata come VERA esegue un’espressione solo una volta e finisce, i “While Loop” sono istruzioni iterative che eseguono una qualche espressione più e più volte finché la condizione diventa FALSA. Se la condizione non risulta mai essere FALSA, il “While Loop” andrà avanti all’infinito e il programma andrà in crash. Al contrario, se il test della condizione risulta FALSO all’inizio del ciclo, l’espressione non verrà mai eseguita.

La sintassi di “While Loops” è:

Esempio 1

Vediamo un esempio. Per prima cosa creiamo una variabile (x) e le assegniamo il valore 1. Poi impostiamo un “While Loop” per testare iterativamente una condizione su quella variabile finché il test della condizione non risulta FALSO:

Così funziona: il valore iniziale della variabile (x) è 1, quindi quando testiamo la condizione “la variabile (x) è inferiore a 10?”, il risultato valuta a VERO e l’espressione viene eseguita, stampando il risultato della variabile (x), che nel primo caso è 1. Ma poi succede qualcosa: la variabile (x) viene incrementata di 1 prima che la funzione termini, e nella prossima iterazione il valore di x sarà 2.

Questa riassegnazione della variabile è importante perché alla fine si raggiungerà la condizione FALSE e l’uscita dal ciclo (valore di x = 10). Se non si cambiano le condizioni iniziali in un “While Loop” si avrà un ciclo infinito e un crash del programma.

Output

 1
2
3
4
5
6
7
8
9

Esempio 2

Hai sentito parlare della sequenza di Fibonacci? Si tratta di una serie di numeri con la caratteristica che il numero successivo nella sequenza si trova sommando i due numeri che lo precedono: 0, 1, 1, 2, 3, 5, 8, 13, 21,… Questa sequenza si trova in diversi fenomeni della natura, e ha diverse applicazioni in finanza, musica, architettura e altre discipline.

Calcoliamola usando un “While Loop”.

In questo caso impostiamo un valore massimo della serie come condizione di stop, in modo che il ciclo stampi la serie di Fibonacci solo per numeri inferiori a 100. Quando un elemento della serie (qualunque esso sia) diventa più grande di 100, il ciclo del ciclo finisce.

 0
1
1
2
3
5
8
13
21
34
55
89

Esempio 3

Un altro modo di generare la serie di Fibonacci con un “While Loop” è, invece di impostare il valore massimo della serie come condizione di stop, impostare il numero di elementi della serie che si vuole generare.

Questo “While Loop” aggiunge il prossimo elemento della serie alla fine dell’elemento precedente, fino a raggiungere una condizione di stop. In questo caso, quando la serie raggiunge 10 elementi (non importa quali valori), il loop cylce termina.

Output

 0 1 1 2 3 5 8 13 21 34

3) Repeat Loops

Strettamente legato al “While Loops”, il “Repeat Loops” esegue le istruzioni in modo iterativo, ma fino a quando una condizione di stop è soddisfatta. In questo modo, le istruzioni vengono eseguite almeno una volta, non importa quale sia il risultato della condizione, e il ciclo esce solo quando una certa condizione diventa VERA:

Repeat Loop

La sintassi di “Repeat Loop” è:

I “Repeat Loops” usano “Break statements” come condizione di stop. I “Break statements” sono combinati con il test di una condizione per interrompere i cicli all’interno dei loop, poiché quando il programma colpisce un break, passerà il controllo all’istruzione immediatamente dopo la fine del loop (se c’è).

I “Repeat Loops” gireranno per sempre se la condizione di break non è soddisfatta. Vedi questi 2 esempi

Esempio 1

Prima creiamo una variabile (x) e le assegniamo il valore 5. Poi impostiamo un “Repeat Loop” per stampare iterativamente il valore della variabile, modificare il valore della variabile (aumentarlo di 1), e testare una condizione su quella variabile (se è uguale a 10) finché il test della condizione non risulta VERO.

La “condizione di rottura” scatta quando la variabile (x) raggiunge 10, e il ciclo finisce.

Output

 5
6
7
8
9

Esempio 2

Ora supponiamo di produrre una lista di numeri casuali, di cui non conosciamo l’ordine o la sequenza di generazione.

In questo esempio useremo un “Repeat Loop” per generare una sequenza di numeri casuali distribuiti normalmente (potete generare numeri casuali con qualsiasi altra distribuzione, noi abbiamo solo scelto questa), e interrompere la sequenza quando uno di questi numeri è maggiore di 1. Poiché non sappiamo quali numeri arriveranno per primi, non sappiamo quanto sarà lunga la sequenza: conosciamo solo la condizione di rottura.

Prima di tutto, usiamo l’istruzione “set.seed” per fissare i numeri casuali (generare sempre gli stessi numeri casuali), e rendere questo esempio riproducibile.

Poi iniziamo il “Repeat Loop” generando un numero casuale normalmente distribuito, stampandolo, e controllando se quel numero è più grande di 1. Solo quando questa condizione diventa VERA (potrebbe essere con il primo numero generato, oppure no), il ciclo del ciclo passerà all’istruzione break e finirà.

Output

 -0.9619334
-0.2925257
0.2587882
-1.152132
0.1957828
0.03012394
0.08541773
1.11661

Questo mostra ancora una volta l’importanza di impostare una corretta condizione di rottura. In caso contrario, il risultato sarà un loop infinito.

Pensieri finali

Abbiamo visto e spiegato i concetti isolatamente, ma le “Strutture di controllo” possono essere combinate in qualsiasi modo: I loop possono contenere diversi loop interni; i condizionali possono contenere loop e condizionali, le opzioni sono infinite. (infatti, rivedendo “Repeat Loops” abbiamo scoperto che gli esempi contenevano “If statements” annidati).

È possibile sviluppare soluzioni avanzate semplicemente combinando le “Control Structures” che abbiamo spiegato in questo articolo. Come affermava Minsky, possiamo raggiungere risultati complessi come risultato dell’interazione di componenti più semplici. Le Strutture di Controllo costituiscono i blocchi di base per i processi decisionali nell’informatica. Cambiano il flusso dei programmi e ci permettono di costruire complessi insiemi di istruzioni a partire da blocchi di costruzione più semplici.

Il mio consiglio è: imparate a conoscerle.

Vi faciliterà il cammino verso la codifica e la comprensione dei programmi, e vi aiuterà a trovare nuovi modi di risolvere i problemi.