[C++] valore massimo in modo ricorsivo
Non riesco bene a capire il funzionamento dell'algoritmo che permette di individuare il valore massimo di un array nella maniera ricorsiva :
Non mi è chiaro soprattutto la seguente riga di codice
Inizialmente la funzione riceve l'intero vettore e la lunghezza del vettore. Quando si richiama invia in particolare &v[1]; Io ho pensato che invia solo il valore contenuto nella cella 1 del vettore iniziale ma ciò non avrebbe senso.
int myMaxArray(int v[], int N) { if (N <= 0) return 0; if (N == 1) return v[0]; int t = myMaxArray(&v[1], N-1); if (v[0] > t) return v[0]; else return t; }
Non mi è chiaro soprattutto la seguente riga di codice
int t = myMaxArray(&v[1], N-1);ovvero quando la funzione richiama se stessa. Quali sono i parametri che invia?
Inizialmente la funzione riceve l'intero vettore e la lunghezza del vettore. Quando si richiama invia in particolare &v[1]; Io ho pensato che invia solo il valore contenuto nella cella 1 del vettore iniziale ma ciò non avrebbe senso.
Risposte
Il pasasggio da te evidenziato non fa altro che passare alla funzione un array, il cui elemento in posizione zero è l'elemento in posizione 1 dell'array attuale.
In quanto in C, se hai un array del tipo
int v[] = {0,1,2,3,4}; Hai che *(v+1) è uguale a v[1]
Quindi in quel passaggio stai inviando l'indirizzo della cella nella posizione numero 1 e la nuova lunghezza N - 1
In quanto in C, se hai un array del tipo
int v[] = {0,1,2,3,4}; Hai che *(v+1) è uguale a v[1]
Quindi in quel passaggio stai inviando l'indirizzo della cella nella posizione numero 1 e la nuova lunghezza N - 1
Ok, riproducendo il programma su un foglio di carta ora mi risulta. Non mi molto chiaro il passaggio in cui invia l'indirizzo della cella 1. Per capirci con un 'esempio io ho il vettore v[] = {0,1,2,3,4} con i vari indirizzi {11205,11206,11207,11208,11209}. Ora con &v[1] invio l'indirizzo della cella [1] 11206 , ma perchè facendo cosi mi ritrovo tutto il vettore che va dall'indirizzo 11206 fino a 11209?
Perché in C, con la notazione int *a oppure int []a, descrivi un puntatore ad un area di memoria e non un array vero e proprio.
Quindi "inviando" il primo indirizzo da tenere in considerazione assieme alla nuova dimensione (n-1), individui il "nuovo" array.
Quindi "inviando" il primo indirizzo da tenere in considerazione assieme alla nuova dimensione (n-1), individui il "nuovo" array.
Grazie ora è più chiaro