Tutte le buone risposte. Una buona parte della mia "carriera" è stata spesa in Fortran, dove tutti gli array sono basati su 1. Va bene se stai scrivendo algoritmi matematici su vettori e matrici, dove gli indici vanno naturalmente a 1 .. N.
Ma non appena inizi a provare a fare algoritmi di tipo informatico, in cui hai un grande array e lavori su parti di esso, come nella ricerca binaria o nell'ordinamento heap, o se è un array di memoria e stai scrivendo allocazione di memoria e algoritmi di liberazione, o iniziando ad agire come parti di esso sono in realtà array multidimensionali in cui devi calcolare gli indici, quella roba a base 1 diventa una vera fonte di confusione.
Ad esempio, se hai un array 1-dimensionale A e vuoi trattarlo come un array NxM bidimensionale, dove I e J sono le variabili dell'indice, in C devi solo dire:
A[ I + N*J ]
ma in Fortran dici
A( (I-1) + N*(J-1) + 1 )
or
A( I + N*(J-1) )
Se era tridimensionale, dovevi fare
A( I + N*(J-1) + N*M*(K-1) )
(Questo è se si trattasse di un ordine di colonna maggiore rispetto all'ordine di riga maggiore che è più comune in C).
Quello che ho imparato a fare in Fortran, quando facevo gli algoritmi di manipolazione delle stringhe, non era mai di pensare ad un indice I come alla posizione di un elemento in un array.
Piuttosto, penserei a una "distanza" N come il numero di elementi che precedono l'elemento di interesse.
In altre parole, pensa sempre in termini di "numero di elementi" piuttosto che "indice di elemento". Ciò mi ha permesso di lavorare all'interno di uno schema di indicizzazione innaturale.