[C] Calcolo media di vettore ricorsivo
Ragazzi scusate ma sto sbattendo da tanto la testa e non riesco a scrivere una riga oltre queste 4...
l'esercizio mi chiede di cercare un utente in un albero e stampare la media dei valori contenuti nel vettore
team->info.voti[] in maniera ricorsiva.
in pratica, per trovare l'utente è una cavolata perchè ho già la sua bella funzione ricorsiva...
Il problema è che non so proprio dove metter le mani per fare la media dei valori dell'array...
questo è il prototipo della funzione datami con il mio brevissimo e nullo svolgimento
Pleaseee help me!!!
l'esercizio mi chiede di cercare un utente in un albero e stampare la media dei valori contenuti nel vettore
team->info.voti[] in maniera ricorsiva.
in pratica, per trovare l'utente è una cavolata perchè ho già la sua bella funzione ricorsiva...
Il problema è che non so proprio dove metter le mani per fare la media dei valori dell'array...
questo è il prototipo della funzione datami con il mio brevissimo e nullo svolgimento

float calcola_media(Type_Tree team, TKey id) { Type_node *trovato = NULL; trovato = binarytree_search(team, team->info); if (trovato == NULL) { printf("giocatore non trovato!\n"); return -1; } else { printf("giocatore TROVATO!\n"); // Andiamo a fare la media // come faccio la media ricorsiva del vettore contenuto all'indirizzo team // trovato? // team->info.voti[ ] ? ? ? ?: (? ? ? ? } }
Pleaseee help me!!!
Risposte
Non riesco proprio a capire come fare la ricorsione del vettore...
Ho provato anche a fare ricorsivamente la printf dei valori, ma nemmeno questo riesco a fare...
Che logica devo utilizzare?
Ho provato anche a fare ricorsivamente la printf dei valori, ma nemmeno questo riesco a fare...
Che logica devo utilizzare?

La media di una sequenza è uguale alla somma degli elementi diviso il numero di elementi. Entrambi questi valori possono essere calcolati ricorsivamente (anche se dovresti specificare esattamente cosa contiene team->info.voti, e.g., c'è un valore "sentinella" che indica la fine dell'array, oppure sai già quanti elementi contiene?).
Pensa al caso base e al passo di induzione: Qual è il caso base? Quanto vale la somma nel caso base? Una volta che conosci la somma di un caso, quanto vale la somma di un caso appena più grande?
Pensa al caso base e al passo di induzione: Qual è il caso base? Quanto vale la somma nel caso base? Una volta che conosci la somma di un caso, quanto vale la somma di un caso appena più grande?
Grazie Claudio86 per l'interessamento!
Allora.. il vettore non ha un valore sentinella, ma una dimensione data dalla variabile globale #define DIM 10, mentre le variabili del vettore sono dei float
Io nella mia mente ho sempre pensato di dividere il vettore un due, dove il primo è costituito da un elemento e il secondo dagli n-1 elementi rimanenti.
Immagino di avere quindi un contatore che ad ogni iterazione incrementa.
Il caso base lo immagino quando il contatore raggiunge la dimensione DIM-1 così che mi ritorno a monte l'ultimo valore del vettore.
rifacendomi unicamente alla somma degli elementi ho scritto queste 2 righe e variazioni di esse:
Ovviamente questo codice mi provoca un loop infinito in quanto ad ogni iterazione il contatore cnt si azzera...
Io non so se la logica che ho adottato è corretta, ma nel caso lo fosse, come lo implemento?
Allora.. il vettore non ha un valore sentinella, ma una dimensione data dalla variabile globale #define DIM 10, mentre le variabili del vettore sono dei float
Io nella mia mente ho sempre pensato di dividere il vettore un due, dove il primo è costituito da un elemento e il secondo dagli n-1 elementi rimanenti.
Immagino di avere quindi un contatore che ad ogni iterazione incrementa.
Il caso base lo immagino quando il contatore raggiunge la dimensione DIM-1 così che mi ritorno a monte l'ultimo valore del vettore.
rifacendomi unicamente alla somma degli elementi ho scritto queste 2 righe e variazioni di esse:
float calcola_media(Type_Tree team, TKey id) { Type_node *trovato = NULL; trovato = binarytree_search(team, team->info); if (trovato == NULL) { printf("giocatore non trovato!\n"); return -1; } else { printf("giocatore TROVATO!\n"); int cnt=0; if(cnt==DIM-1) return team->info.voti[cnt]; else { cnt++; return team->info.voti[cnt]+calcola_media(team, id); } } }
Ovviamente questo codice mi provoca un loop infinito in quanto ad ogni iterazione il contatore cnt si azzera...
Io non so se la logica che ho adottato è corretta, ma nel caso lo fosse, come lo implemento?

Continui a chiamare "calcola_media" con gli stessi parametri, ovviamente avrai una ricorsione infinita. Il punto è che non puoi chiamare ricorsivamente "calcola_media", perché non prende in ingresso un vettore ma un nodo. Devi creare un'altra funzione che prenda in ingresso un vettore (e... un altro parametro) e che calcoli la somma (chiamala "calcola_somma").
Claudio grazie per l'aiuto. Secondo me il mio problema è proprio questo... non penso che la traccia mi permetta di utilizzare un'altra funzione... 
ti riporto in maniera integrale la traccia
/* RICORSIVA
* Calcola il voto medio ottenuto dal giocatore.
* Controlla che l'atleta sia presente nella squadra
* In caso di errore o se l'atleta non ha disputato partite restituisce -1
*/
float calcola_media (Type_Tree team, TKey id);
Altre funzioni calcolanti la media non me ne hanno date da fare e non penso di poter inserire funzioni a mio piacimento
grgrgr :
Però se mi dici che così non è fattibile far la media utilizzando solo questa funzione ti credo perchè non so proprio cosa mai si potrebbe far altrimenti.

ti riporto in maniera integrale la traccia
/* RICORSIVA
* Calcola il voto medio ottenuto dal giocatore.
* Controlla che l'atleta sia presente nella squadra
* In caso di errore o se l'atleta non ha disputato partite restituisce -1
*/
float calcola_media (Type_Tree team, TKey id);
Altre funzioni calcolanti la media non me ne hanno date da fare e non penso di poter inserire funzioni a mio piacimento

Però se mi dici che così non è fattibile far la media utilizzando solo questa funzione ti credo perchè non so proprio cosa mai si potrebbe far altrimenti.
Ho letto meglio il tuo codice, e c'è qualcos'altro che non torna. Cosa sono "team" e "id"? Cos'è "trovato"? Non riesco davvero a capire che operazioni siano... Comunque quando scrivi
la condizione sarà sempre falsa, "cnt" vale zero, l'hai appena scritto. Hai bisogno di passare l'indice corrente alla funzione ricorsiva, così puoi raggiungere il caso base. A occhio non si può con quei parametri (ma come detto sopra, non ho idea di cosa rappresentino, quindi potrei sbagliarmi).
int cnt=0; if(cnt==DIM-1)
la condizione sarà sempre falsa, "cnt" vale zero, l'hai appena scritto. Hai bisogno di passare l'indice corrente alla funzione ricorsiva, così puoi raggiungere il caso base. A occhio non si può con quei parametri (ma come detto sopra, non ho idea di cosa rappresentino, quindi potrei sbagliarmi).
"claudio86":
Ho letto meglio il tuo codice, e c'è qualcos'altro che non torna. Cosa sono "team" e "id"? Cos'è "trovato"? Non riesco davvero a capire che operazioni siano...
*team: sarebbe la radice dell'albero, ovvero la squadra che raggruppa tutti i giocatori.
*id: sarebbe la key con la quale cerco il mi giocatore all'interno dell'albero (numero maglia giocatore).
*trovato: è il puntatore al nodo contenente il giocatore che mi interessa. Nodo che mi viene restituito dalla funzione di ricerca binaria.
"claudio86":
Comunque quando scrivi
int cnt=0; if(cnt==DIM-1)
la condizione sarà sempre falsa, "cnt" vale zero, l'hai appena scritto. Hai bisogno di passare l'indice corrente alla funzione ricorsiva, così puoi raggiungere il caso base. A occhio non si può con quei parametri (ma come detto sopra, non ho idea di cosa rappresentino, quindi potrei sbagliarmi).
Secondo te non c'è alcun modo di creare un ricorsione con questa funzione?
Non esiste un modo che non faccia azzerare il mio contatore ogni volta?
Purtroppo questo è il prototipo che mi hanno assegnato altrimenti io avrei nei parametri che si passano avrei messo anche il contatore(penso che in quel modo avrebbe funzionato no?).
"toniospritz":
*team: sarebbe la radice dell'albero, ovvero la squadra che raggruppa tutti i giocatori.
*id: sarebbe la key con la quale cerco il mi giocatore all'interno dell'albero (numero maglia giocatore).
*trovato: è il puntatore al nodo contenente il giocatore che mi interessa. Nodo che mi viene restituito dalla funzione di ricerca binaria.
Allora c'è qualcosa che non va nel codice che hai scritto tu: non usi "id" da nessuna parte, né "trovato".
"toniospritz":
Secondo te non c'è alcun modo di creare un ricorsione con questa funzione?
Non esiste un modo che non faccia azzerare il mio contatore ogni volta?
Purtroppo questo è il prototipo che mi hanno assegnato altrimenti io avrei nei parametri che si passano avrei messo anche il contatore(penso che in quel modo avrebbe funzionato no?).
No, non vedo un modo di usare questa funzione in modo ricorsivo. Non riceve nessun parametro che possa ridurre la dimensione dell'array dei voti.
A questo punto potrebbe essere che la richiesta "RICORSIVA" sia riferita alla ricerca del giocatore, e la media vada poi calcolata nel modo più classico (iterativo). Cioè, non puoi usare "binarytree_search".
Grazie claudio, per quanto riguarda l'utilizzo di id ci ho fatto caso ieri alla mia mancanza, e aggiustato quella distrazione() come avevo scritto mi trovava la key della mia radice...
A questo punto penso che tu abbia proprio ragione e che magari l'esercizio richieda la ricorsione per la ricerca binaria...
La media fatta iterativamente si scrive in due secondi... Per i miei gusti ci sono stato anche troppo su questo esercizio.
:/
A questo punto penso che tu abbia proprio ragione e che magari l'esercizio richieda la ricorsione per la ricerca binaria...
La media fatta iterativamente si scrive in due secondi... Per i miei gusti ci sono stato anche troppo su questo esercizio.
:/