----- 8/12/06 ----- > [Mi sono posto l'obiettivo di formalizzare] > un programma ricorsivo in java che prenda in input un vettore > e lo restituisca modificato in questo modo: array[i] = i per > i = 0, 1, 2, ..., n-1, con n = array.length. > > [...] Il codice che ho scritto, anche se il programma richiama > se stesso, non mi sembra ricorsivo [..., ma] iterativo. > > In pratica vorrei sapere se questo programma e' ricorsivo: > > public static void assegnaI(int []array,int i) > { > if(i==array.length-1) > array[i]=i; > else > { > array[i]=i; > i++; > assegnaI(array,i); > } > } Il programma e' ricorsivo, in quanto presuppone un modello computazionale ricorsivo per poter essere eseguito, proprio perche' la procedura fa riferimento a se stessa. Le perplessita' sono comunque giustificate: l'idea algoritmica alla base del codice riportato sopra non e' ricorsiva ma iterativa, e a tale idea e' stato poi imposto a forza uno schema ricorsivo. Ci sono infatti due elementi che lasciano intravedere la struttura di un ciclo "for" dietro l'apparenza ricorsiva: il centro dell'attenzione e' l'indice dell'array e non l'array come struttura, per cui il problema che si sta risolvendo ricorsivamente e' piuttosto innaturale da formulare, e l'incremento esplicito della variabile di controllo i, di fatto inutile (nel senso che e' inutile modificare il valore di i). Una soluzione "un po' piu' ricorsiva anche nello spirito" potrebbe essere la seguente: public static void assegnaI( int[] array, int n ) { // n < array.length if ( n >= 0 ) { assegnaI( array, n-1 ); array[n] = n; } } Un utile esercizio e' formulare esplicitamente il problema che si sta risolvendo secondo il paradigma ricorsivo nei due casi. Per concludere: utilizzando Java in casi come quello considerato, la codifica ricorsiva al posto di un "for" puo' avere senso solo come puro esercizio, non nella pratica della programmazione. ----- * -----