Media di un intervallo dell'array con ricorsione

di il
5 risposte

Media di un intervallo dell'array con ricorsione

Salve a tutti,

ho da poco iniziato a programmare in Java con Eclipse. Devo creare un metodo ricorsivo (senza usare comandi iterativi) che preso un array di interi e due interi che fanno da inizio e fine intervallo, mi restituisca un double con la media dei valori dell'intervallo. Prima ho scritto il metodo senza ricorsione con un ciclo for, poi ho cercato di trasporlo in metodo ricorsivo. Sono riuscito a eseguire la somma ma non la divisione per il numero di valori dell'intervallo scelto. Il codice sarà più esplicativo:
public class MainClass {

	static double mediaComandoIterativo(int[]a, int l, int r) {		//IL METODO SENZA RICORSIONE FUNZIONA
		if (a==null || a.length==0 || l<0 || l>a.length || r<0 || r>a.length) return -1;
		if (l==r) return l;
		int somma=0;
		if (r>l) {
			for (int i=l; i<=r; i++) somma+=a[i];
			return somma/(r-l+1);
		}
		else {
			for (int i=r; i<=l; i++) somma+=a[i];
			return somma/(l-r+1);
		}
	}
	
	static double media(int[]a, int l, int r) {	//IL METODO RICORSIVO NON FUNZIONA
	    //if (a==null || a.length==0 || l<0 || l>a.length || r<0 || r>a.length) return -1;
		if (l==r) return a[r];
		return a[r]+media(a, l, --r);		//NON RIESCO A TROVARE IL MODO DI FARE LA DIVISIONE PER IL NUMERO DI VALORI DELL'INTERVALLO
		}

	public static void main(String[] args) {
		int[]a={5,2,7,9,3};
		System.out.println(media(a, 1, 3));
	}
}

5 Risposte

  • Re: Media di un intervallo dell'array con ricorsione

    Una delle cose che devi imparare a fare e' quella di avere SEMPRE le informazioni messe nel modo giusto. E questo per scrivere codice SEMPLICE, senza arzigogoli vari.
    In questo caso, l'idea da seguire e' la seguente:

    PRIMO) controlli se il vettore e' null, nel qual caso
    1) termini subito OPPURE
    2) crei un vettore di lunghezza zero
    SECONDO controlli che l sia SEMPRE minore di r, altrimenti LI INVERTI
    TERZO controlli che 0 <= l <= r <= v.size(), e se cio' non dovesse avvenire, fai le opportune correzioni

    Una volta seguiti questi passi preliminari puoi implementare la media SAPENDO GIA' che
    1) il vettore non e' null
    2) l e r sono nell'ordine giusto e nel range giusto.

    QUINDI non ti serve fare i controlli di consistenza.

    Ora, la media e' "somma tutti DIVISO il numero di elementi".
    Il trucco sta' nel capire che NON TI SERVE calcolare le medie parziali, ma la puoi calcolare solo alla fine, che poi e' lo stesso sistema che usi iterativamente.
    QUINDI quello che ti basta fare e' calcolare la somma RICORSIVAMENTE.
    Ma come si calcola la somma?

    Facile:
    1) caso banale, l==r allora la somma e' v[l]
    2) caso generico, l < r: prendi il punto di mezzo (intero!) m= int((l+r)/2)
    ora la somma tra l e r e' data dalla somma tra l ed m PIU' la somma tra m ed r

    ATTENZIONE: c'e' un problemino di indici da risolvere, ma questo te lo lascio a te, altrimenti ti farei l'essercizio io

    Usare le medie parziali, invece, sarebbe piu' complicato, perche' la media di due media NON E' la media dei valori coinvolti. Quindi, oltre alla media, dovresti portarti dietro anche l'info relativa a QUANTI numeri sono stati utilizzati per calcolare quella media: COMPLICATO
  • Re: Media di un intervallo dell'array con ricorsione

    Non capisco... provo a spiegarmi meglio: io devo trovare un metodo ricorsivo generico che dati un array di interi e due interi, rispettivamente un insieme di interi qualsiasi di qualsiasi dimensione, l'indice dell'array da cui iniziare a fare la somma della media e l'indice dell'array che chiude la somma della media (estremi inclusi), mi trovi la media della somma dei numeri nell'intervallo scelto. Es: a={5,7,2,9,3}, l=1, r=3; la restituzione deve essere (7+2+9)/3.0=6.0.

    Le condizioni iniziali e il caso banale li ho capiti, ma non il caso generico, in cui non comprendo a che serva trovare il punto di mezzo.

    Grazie mille per l'aiuto!
  • Re: Media di un intervallo dell'array con ricorsione

    Mettiamola cosi':

    - il punto di mezzo NON TI SERVE. NON E' fondamentale. L'algo e' meno efficiente, ma si puo' fare senza
    - NON HAI il ciclo: non esiste il for. Non c'e', il linguaggio non lo prevede!!!!
    - MA hai le funzioni e una funzione puo' richiamare QUALUNQUE altra funzione, PURE se stessa.

    RIPETO: la MEDIA e' LA SOMMA DIVISO il numero di elementi.
    Quindi, INIZIA con la SOMMA: COME calcola la somma in modo ricorsivo?

    Risolto questo, sei al 50%
  • Re: Media di un intervallo dell'array con ricorsione

    La somma la so fare, come scritto nel primo messaggio è proprio la divisione che non riesco a eseguire. Se aumento l o riduco r per far scorrere l'indice dell'array, come faccio poi a ricordare il numero di elementi dell'intervallo con l-r+1? Sono ore che ci sbatto la testa ma niente.
  • Re: Media di un intervallo dell'array con ricorsione

    Sei riuscito a completare l'esercizio, potresti inviarmelo svolto ?? in caso ti spiego il mio metodo . Vorrei capire come il vostro insegnate vi fa fare gli esercizi , sono un professore che insegna programmazione a Cerignola.
Devi accedere o registrarti per scrivere nel forum
5 risposte