Interpretazione funzione ricorsiva [C]
Buon pomeriggio a tutti.
Sto cercando di capire il comportamento di una data funzione ricorsiva , ma ci sono delle cose che non mi tornano. Ecco il codice:
Ora, alla funzione in questione vengono passati l'indirizzo della cella di memoria in cui è allocato il primo valore dell'array che si prende in considerazione e la lunghezza di tale array.
Domanda(/e) 1:
Ha senso, nella prima "chiamata ricorsiva" (caso if (n%2)), passare lo stesso array di dimensione dimezzata? Se sì, che cosa viene passato? Un array con la metà degli elementi di partenza? Ma quali?
Domanda(/e) 2:
Che cosa succede quando invoco D(a+n/2+1,n/2)? Che senso ha la somma a+n/2+1? Sommo al nome di un vettore degli interi, ma a che pro?
Grazie in anticipo per la disponibilità.
Sto cercando di capire il comportamento di una data funzione ricorsiva , ma ci sono delle cose che non mi tornano. Ecco il codice:
int D(int a[], int n) { if (n==0) return 0; if (n==1) return a[0]; if (n%2) return D(a,n/2) + a[n/2] + D(a+n/2+1,n/2); return D(a,n/2) + D(a+n/2,n/2); }
Ora, alla funzione in questione vengono passati l'indirizzo della cella di memoria in cui è allocato il primo valore dell'array che si prende in considerazione e la lunghezza di tale array.
Domanda(/e) 1:
Ha senso, nella prima "chiamata ricorsiva" (caso if (n%2)), passare lo stesso array di dimensione dimezzata? Se sì, che cosa viene passato? Un array con la metà degli elementi di partenza? Ma quali?
Domanda(/e) 2:
Che cosa succede quando invoco D(a+n/2+1,n/2)? Che senso ha la somma a+n/2+1? Sommo al nome di un vettore degli interi, ma a che pro?
Grazie in anticipo per la disponibilità.
Risposte
I tuoi problema non hanno niente a che fare con le chiamate ricorsive, ma solo con l'uso dei puntatori. Nella tua funzione a è semplicemente un puntatore al primo elemento dell'array che stai considerando. Il codice della funzione ignora quale sia la reale dimensione di tale array e si fida di quello che gli viene passato. Per cui se l'utente dice che ci sono n/2 elementi, allora per lui sarà un array che partirà in a e avrà n/2 elementi (primi n/2 dell'array originale). a + n/2 + 1 è equivalente a &a[n/2+1] usando l'aritmetica dei puntatori e forse l'avrei scritto in quest'ultimo modo per rendere il codice più leggibile. a + n/2 è invece equivalente a &a[n/2].
Ah che imbecille che sono!
Grazie mille apatriarca, sempre molto disponibile.
Grazie mille apatriarca, sempre molto disponibile.
Quindi, se ho ben capito, scrivendo D(a+n/2+1,n/2), si passa alla funzione l'indirizzo dell'elemento in posizione n/2+1 dell'array di partenza, che diventa l'elemento in posizione 0 di questo "nuovo array" (costituito da n/2 elementi, e nel quale a1[0]=a[n/2+1] - a1 è il nome di questo "fittizio nuovo array") ... ?
Sì, qualcosa del genere.