DIPARTIMENTO DI
INFORMATICA Università di Torino | |
Lezione di Lunedi' 11/02/02 - ultimo aggiornamento: 12/02/02Ancora ricorsione.CHE COSA E' STATO FATTO A LEZIONE
Funzioni ricorsive che stampano gli elementi di un arrayStampa ricorsiva di una porzione di un array di interi (questa funzione e' ricorsiva di coda, e la sua asserzione iniziale e' "piu' generale" di quella della funzione "printarr_rt" in [NOTE1: pag. 38]).) /* AI: "first" e "last" sono indici validi per "a" AF: Stampa tutti gli elementi di a[first..last] */ void print_arr_rt (int[] a, int first, int last) { if (first <= last) { printf("%d", a[first]); print_arr_rt(a,first+1,last); } }
Stampa ricorsiva di una porzione di un array di interi in ordine inverso (questa funzione NON e' ricorsiva di coda, e la sua asserzione iniziale e' "piu' generale" di quella della funzione "printarr_rn" in [NOTE1: pag. 38]).) /* AI: "first" e "last" sono indici validi per "a" AF: Stampa tutti gli elementi di a[first..last] */ void print_arr_inv_rn (int[] a, int first, int last) { if (first <= last) { print_arr_inv_rn(a,first+1,last); printf("%d", a[first]); } }
Stampa ricorsiva di una porzione di un array di interi in ordine inverso (ATTENZIONE: questa funzione e' una versione ricorsiva di coda della funzione precedente /* AI: "first" e "last" sono indici validi per "a" AF: Stampa tutti gli elementi di a[first..last] */ void print_arr_inv_rt (int[] a, int first, int last) { if (first <= last) { printf("%d", a[last-1]); print_arr_inv_rt(a,first,last-1); } }
Funzioni ricorsive che effettuano "operazioni di aggregazione" sugli elementi di un arraySomma ricorsiva di una porzione di un array di interi (questa funzione NON e' ricorsiva di coda, e "generalizza" la funzione "sumarr_rn" in [NOTE1: pag. 38]).) /* AI: "first" e "last" sono indici validi per "a" AF: Restituisce la somma degli elementi di a[first..last] */ int sum_arr_rn (int[] a, int first, int last) { if (first > last) return 0; else return a[first] + sum_arr_rn(a,first+1,last); }
Versione ricorsiva di coda della funzione precedente. NOTA: per mantenere inalterato il prototipo (tipo del risultato e nome, numero, e tipo dei parametri) e' stato necessario "incapsulare" la funzione ricorsiva dentro un'altra funzione. /* AI: "first" e "last" sono indici validi per "a" AF: Restituisce la somma degli elementi di a[first..last] */ int sum_arr (int[] a, int first, int last) { return sum_arr_rt(a,first,last,0); } /* AI: "first" e "last" sono indici validi per "a" AF: Restituisce il valore ottenuto sommando di "acc" e gli elementi di a[first..last] */ int sum_arr_rt (int[] a, int first, int last, int acc) { if (first > last) return acc; else return sum_arr_rn(a,first+1,last, a[first]+acc); }
Altra versione (sempre ricorsiva di coda) della funzione precedente. NOTA: anche in questo caso per mantenere inalterato il prototipo (tipo del risultato e nome, numero, e tipo dei parametri) e' stato necessario "incapsulare" la funzione ricorsiva dentro un'altra funzione. /* AI: "first" e "last" sono indici validi per "a" AF: Restituisce la somma degli elementi di a[first..last] */ int sum_arr1 (int[] a, int first, int last) { int r = 0; sum_arr_rt(a,first,last,&r); return r; } /* AI: "first" e "last" sono indici validi per "a" AF: Il valore di partenza di "*ris" e' stato incrementato con la somma degli elementi di a[first..last] */ void sum_arr_rt (int[] a, int first, int last, int *ris) { if (first<=last) { *ris+=a[first]; sum_arr_rt(a,first+1,last,ris); } } |
Last update: Feb 14, 2002 | |