## Ciclo for

I cicli while sono utili per le situazioni dove voi volete compiere un'azione fintantoché una condizione rimane true ma si adattano meno per compiere un'azione un determinato numero di volte. Per esempio in un precedente esercizio, quando volevamo muoverci `passiTotali` volte indietro, abbiamo dovuto creare una nuova variabile, iniziallizarla e muoverci indietro finché l'incremento di questa variabile non l'avrebbe resa uguale a `passiTotali`.

In situazioni simili i cicli `for` diventano utili. La loro sintassi è la seguente:

    [!java|c]for (inizializzazione; condizione; incremento) {
        azione();
    }[/!][!python]for variabile in sequenza di valori:
        azione()[/!][!scala] for (variabile <- primoValore to ultimoValore) {
        azione();
    }[/!]

Per esempio per ripente il contenuto del ciclo `n` volte[!python] è utile usare l'istruzione `range(n)` per generare una sequenza di n valori interi da 0 fino ad n-1.[/!][!java|scala|c] dovreste scrivere:[/!]

    [!java]for (int stepper=0; stepper<n; stepper++) {
        action();
    }[/!][!c]int stepper;
    for (stepper=0; stepper<n; stepper++) {
        action();
    }[/!][!python]for stepper in range(n):
        action()[/!][!scala] for (stepper <- 1 to n) {
        action();
    }[/!]

This code is then equivalent to the following one from the computer point of view. From the programmer point of view, one form or the other can make the source code easier to read, depending on the situation. You should chose wisely in each situation whether you want to use a for loop or a while loop. Your uttermost goal should remain to keep your code simple and easy to read, to ensure that your day remain pleasant and productive.

    [!java|c]int stepper = 0;
    while (stepper < n) {
        action();
        stepper++;
    }[/!][!python]stepper=0
    while stepper < n:
        action()
        stepper = stepper + 1[/!][!scala]
    var stepper = 1
    while (stepper <= n) {
        action()
        stepper = stepper + 1
    }[/!]

In that case, the `for` loop is easier to read, don't you think?

[!java|c]

È possibile costruire cicli `for` più avanzati dato che qualsiasi istruzione valida può essere usata come inizializzazione, condizione ed incremento. Il seguente esempio è un po' estremo e mostra come non serva il contenuto di un ciclo per muovere i buggle in avanti fino ad arrivare al muro, ma funziona bene: tutto il lavoro viene svolto nelle istruzioni della condizione e dell'incremento.

    for (; !isFacingWall() ; forward()) {
       /* niente nel contenuto del ciclo */
    }
    /* ora i buggle fronteggiano il muro */

[/!] [!scala]

se volete annidare diversi cicli in Scala potete farlo su una sola riga. Questo significa che i due seguenti spezzoni di codice sono equivalenti:

    for (stepper1 <- 1 to n) {
        for (stepper2 <- 1 to m) {
           azioni()
        }
    }

    for (stepper1 <- 1 to n; stepper2 <- 1 to m) { // Separare semplicemente le condizioni di entrambi i loop con un punto e virgola
        azioni()
    }

[/!]

### Traguardo dell'esercizio

Ora dovete rifare lo stesso vecchio esercizio (muoversi avanti fino a sormontare un baggle, prenderlo, ritornare indietro alla posizione iniziale, posare il baggle) ma usando un ciclo `for` invece che un ciclo `while` per tornare indietro alla posizione iniziale.

Quando avrete finito potrete procedere al prossimo esercizio.