Il ciclo iterativo while

Qualche tempo fa abbiamo parlato dei cicli iterativi e in particolare del ciclo for. I cicli sono una componente fondamentale di un linguaggio di programmazione e consentono di ripetere per un certo numero di volte una sequenza di istruzioni. Definita una variabile contatore e definiti n valori che tale variabile dovrà assumere, Il ciclo for ripete un blocco di istruzioni, aggiornando ciclo dopo ciclo il valore della variabile contatore finché questa non avrà assunto tutti i possibili valori.

Il ciclo while invece ha una logica un po’ diversa. Potenzialmente, un ciclo while potrebbe anche essere infinito perché non è richiesta alcuna variabile contatore: sarà il programmatore a stabile se è opportuno utilizzarla o meno. L’unica cosa che richiede il ciclo while è una condizione logica: finché questa sarà soddisfatta, il codice continuerà a essere ripetuto.


i <- 0 while(i == 0) print(i) [/code]

Nell’esempio qui sopra è stata creata una variabile i che contiene il valore 0. La condizione logica espressa nel ciclo while impone che l’istruzione prosegua nelle iterazioni finché i sarà uguale a 0. Dato che all’interno del ciclo i non viene in alcun modo alterata, l’istruzione while andrà avanti all’infinito rendendo necessario l’arresto forzato di R.

Se invece volessimo realizzare solo 100 iterazioni, dovremmo fare in modo che, all’interno del ciclo, i venga di volta in volta aggiornata, diventando così un vero e proprio contatore: quanto i varrà 100, il ciclo si chiuderà.


i <- 0 while(i < 100) { i <- i+1 print(i) } [/code]

Il ciclo qui sopra quindi non è infinito ma realizza 100 iterazioni. La potenza dell’istruzione while sta però proprio nel fatto di togliere al programmatore l’onere di stabilire in partenza il numero di iterazioni (per quello esiste già il ciclo for!). Può capitare infatti che il programmatore non abbia un’idea precisa di quante iterazioni occorrano per raggiungere un certo risultato; in questi casi sarà il codice a dover “capire” quando è giunta l’ora di concludere il ciclo.

Proviamo a fare un esempio pratico. Dobbiamo creare un ciclo while che, dato un certo numero x, a ogni iterazione tolga a x la sua radice quadrata; il ciclo si dovrà fermare quando x sarà inferiore a 1. Di seguito è riportato il codice per x = 100.


x <- 100 while(x >= 1)
x <- x-sqrt(x) [/code]

Dopo aver definito il valore x, il ciclo while viene avviato; esso parte (e prosegue) solo se x è maggiore di 1. Nel corso delle iterazioni x viene di volta in volta aggiornato, sottraendogli la sua radice quadrata. Il ciclo si chiuderà quando la condizione logica in apertura restituirà FALSE, cosa che capiterà soltanto quando x sarà minore di 1.

Possiamo aggiungere un vincolo al ciclo, facendo in modo che il numero di iterazioni non superi mai un certo valore; questa è una strategia che viene utilizzata spesso negli algoritmi di ottimizzazione, i quali a un certo punto devono concludersi anche se la soluzione del problema di ottimizzazione non è stata individuata. Nel nostro caso possiamo imporre che il ciclo non ecceda le 10 iterazioni. Per fare questo avremo bisogno di una variabile contatore che, aggiornata iterazione dopo iterazione, tenga traccia del numero di cicli eseguiti.


x <- 100 i <- 0 while(x >= 1 & i < 10) { i <- i+1 x <- x-sqrt(x) } [/code]

Il ciclo riportato qui sopra terminerà ben prima che la variabile x sia diventata inferiore a 1. Infatti, quando il contatore i avrà raggiunto il valore 10, il ciclo si dovrà in ogni caso arrestare e questo a prescindere dal valore di x. Vale però anche il contrario: il ciclo potrà fermarsi ben prima delle 10 iterazioni se x sarà giunto a un valore inferiore a 1. Difatti, perché la condizione x >= 1 & i < 10 risulti vera, x deve essere maggiore o uguale a 1 e contemporaneamente i minore di 10. Quando anche solo una delle due variabili non dovesse rispettare la condizione posta, il ciclo terminerà.

Il ciclo while è un’istruzione fondamentale quando si utilizza R per creare del codice “intelligente”, cioè scritto in modo che sia in grado di valutare autonomamente delle condizioni e decidere quanto spingersi nella soluzione di un problema. Forse nell’uso quotidiano di R è poco applicato (io di solito preferisco il for) ma ci sono casi in cui questa istruzione diventa davvero imprescindibile.

Print Friendly

Lascia un Commento