00
:
00
:
00
:
00
•Corso SEO AI - Usa SEOEMAIL al checkout per il 30% di sconto

Ciclo while in R

Il ciclo while in R permette di ripetere un blocco di codice finché una determinata condizione rimane vera. A differenza del ciclo for, che itera su un insieme predefinito di elementi, il while è ideale quando non si conosce in anticipo il numero di iterazioni necessarie.

Sintassi di Base

La struttura del ciclo while è semplice: si valuta una condizione e, finché risulta TRUE, il blocco di codice viene eseguito ripetutamente.

# Sintassi base del while
# while (condizione) {
#   istruzioni
# }

# Contatore semplice
i <- 1
while (i <= 5) {
  print(paste("Iterazione:", i))
  i <- i + 1
}
# [1] "Iterazione: 1"
# [1] "Iterazione: 2"
# [1] "Iterazione: 3"
# [1] "Iterazione: 4"
# [1] "Iterazione: 5"

Contatori e Accumulatori

Il while è particolarmente utile quando si lavora con contatori e accumulatori per calcoli iterativi.

# Somma dei primi n numeri naturali
n <- 100
somma <- 0
i <- 1
while (i <= n) {
  somma <- somma + i
  i <- i + 1
}
print(paste("La somma dei primi", n, "numeri è:", somma))
# [1] "La somma dei primi 100 numeri è: 5050"
# Calcolo del fattoriale
numero <- 6
fattoriale <- 1
contatore <- numero
while (contatore > 1) {
  fattoriale <- fattoriale * contatore
  contatore <- contatore - 1
}
print(paste(numero, "! =", fattoriale))
# [1] "6 ! = 720"

Calcolo Iterativo: Approssimazione della Radice Quadrata

Un esempio classico di calcolo iterativo è il metodo di Newton per approssimare la radice quadrata.

# Metodo di Newton per la radice quadrata
numero <- 25
stima <- numero / 2
tolleranza <- 1e-10
iterazioni <- 0

while (abs(stima^2 - numero) > tolleranza) {
  stima <- (stima + numero / stima) / 2
  iterazioni <- iterazioni + 1
}

print(paste("Radice quadrata di", numero, "=", stima))
# [1] "Radice quadrata di 25 = 5"
print(paste("Iterazioni necessarie:", iterazioni))
# [1] "Iterazioni necessarie: 6"

Il Costrutto repeat con break

R offre anche il costrutto repeat, che crea un ciclo infinito da cui si esce esplicitamente con break. Questo è utile quando la condizione di uscita deve essere valutata all’interno del ciclo.

# repeat esegue il blocco finché non incontra break
tentativo <- 0
repeat {
  tentativo <- tentativo + 1
  dado <- sample(1:6, 1)
  cat("Tentativo", tentativo, "- Risultato:", dado, "\n")
  if (dado == 6) {
    cat("Sei uscito! Ci sono voluti", tentativo, "tentativi.\n")
    break
  }
}
# Tentativo 1 - Risultato: 3
# Tentativo 2 - Risultato: 1
# Tentativo 3 - Risultato: 6
# Sei uscito! Ci sono voluti 3 tentativi.

while con Condizione di Uscita Complessa

Si possono combinare piĂą condizioni per controllare il ciclo in modo flessibile.

# Ciclo con condizione composta
saldo <- 1000
tasso <- 0.05
anno <- 0
obiettivo <- 1500

while (saldo < obiettivo && anno < 50) {
  saldo <- saldo * (1 + tasso)
  anno <- anno + 1
}

cat("Dopo", anno, "anni, il saldo è:", round(saldo, 2), "\n")
# Dopo 9 anni, il saldo è: 1551.33

Uso di next per Saltare Iterazioni

La parola chiave next permette di saltare il resto dell’iterazione corrente e passare alla successiva.

# Stampare solo i numeri dispari da 1 a 10
i <- 0
while (i < 10) {
  i <- i + 1
  if (i %% 2 == 0) {
    next  # Salta i numeri pari
  }
  print(i)
}
# [1] 1
# [1] 3
# [1] 5
# [1] 7
# [1] 9

Confronto tra while e for

Il ciclo for è preferibile quando si conosce il numero di iterazioni, mentre il while è adatto quando la condizione di uscita dipende da un calcolo interno.

# Con for: iterazioni note
for (i in 1:5) {
  cat("for -", i, "\n")
}

# Con while: iterazioni non note a priori
valore <- 1024
contatore <- 0
while (valore > 1) {
  valore <- valore / 2
  contatore <- contatore + 1
}
cat("Servono", contatore, "divisioni per arrivare a 1\n")
# Servono 10 divisioni per arrivare a 1

Attenzione ai Cicli Infiniti

Un errore comune con il while è dimenticare di aggiornare la variabile di controllo, creando un ciclo infinito. Assicurati sempre che la condizione possa diventare FALSE.

# ATTENZIONE: ciclo infinito! (NON eseguire)
# i <- 1
# while (i <= 10) {
#   print(i)
#   # Manca i <- i + 1, quindi i resta sempre 1
# }

# Versione corretta
i <- 1
while (i <= 10) {
  print(i)
  i <- i + 1  # Aggiornamento fondamentale
}

Per proteggersi dai cicli infiniti, si puo aggiungere un contatore di sicurezza:

# Protezione contro cicli infiniti
max_iterazioni <- 10000
iterazione <- 0
x <- 0.1

while (x != 1) {  # Condizione rischiosa con numeri decimali
  x <- x + 0.1
  iterazione <- iterazione + 1
  if (iterazione >= max_iterazioni) {
    cat("Interrotto dopo", max_iterazioni, "iterazioni. x =", x, "\n")
    break
  }
}

Conclusione

Il ciclo while in R è uno strumento fondamentale per le iterazioni in cui il numero di ripetizioni non è noto a priori. Combinato con break e next, offre un controllo flessibile sul flusso di esecuzione. Il costrutto repeat rappresenta un’alternativa utile quando la condizione di uscita va valutata all’interno del ciclo. Ricorda sempre di aggiornare la variabile di controllo e di prevedere meccanismi di sicurezza per evitare cicli infiniti.