Perché il ciclo a base 1 e quindi a sottrarne uno?

1

In un libro che si occupa di riquadri latini ortogonali tra loro ortogonali, c'è un esempio di implementazione di un generatore. La parte del codice è la seguente:

for (int k = 1; k <= numberOfLevels; k++) {
    for (int i = 1; i <= size; i++) {
        for (int j = 1; j <= size; j++) {
            squareArray[k - 1][i - 1,j - 1] = ( k * (i - 1) + (j - 1) ) % size;
        }
    }
}

Mi chiedo, perché i=1 e j=1 e quindi sottraendo 1 ? Per k capisco che è utilizzato per la moltiplicazione.

    
posta John V 19.06.2017 - 20:57
fonte

1 risposta

2

Questa è solo una scelta di stile del codice che forse l'autore pensava sarebbe stato più chiaro. Potresti facilmente riscriverlo come

for (int k = 0; k < numberOfLevels; k++) {
    for (int i = 0; i < size; i++) {
        for (int j = 0; j < size; j++) {
            squareArray[k][i,j] = ((k+1) * (i + j)) % size;
        }
    }
}

Il problema qui è che pensiamo intuitivamente che le liste passino da 1 a N, dove N è il numero di elementi. Ma tutti gli array in c # sono base 0, quindi dovremmo sottrarre. Puoi sottrarre quando dichiari il loop (come ho fatto io) o sottrarre quando usi le variabili di ciclo (come fa l'autore originale).

Penso che forse l'autore ha scelto di sottrarre quando si usano le variabili del ciclo perché ci sono posti in cui ha effettivamente bisogno del numero di indice originale (da 1 a N), ad es. quando si calcola il modulo della dimensione.

    
risposta data 19.06.2017 - 21:03
fonte

Leggi altre domande sui tag