labatteria.it • Leggi argomento - LINGUAGGIO C - funzione che ricerca max nodo dell'albero


LINGUAGGIO C - funzione che ricerca max nodo dell'albero

Qui nessuna conversazione sara' off-topic: tutti gli argomenti sono ammessi (eccetto quelli che rientrano negli altri forum).

Messaggioda Shanik il ven mag 22, 2009 6:21 pm

devo fare una funzione che cerca il massimo di tutti i nodi (il contenuto dei nodi) in un albero binario NON ORDINATO..
l'ho fatta ricorsiva..
non funziona.. dice sempre che il max è in testa!!
è sicuramente un errore concettuale...
chi mi aiuta...???
questa è la funzione scritta da me..


Tnode* ricerca_max_punteggio(Ttree tree){

Tnode* max=tree;
if ((tree->left==NULL)&&(tree->right==NULL))
return max;
else
{
ricerca_max_punteggio(tree->left);
if (tree->contest.vincitore.punteggio>max->contest.vincitore.punteggio)
{
max=tree;
return max;
}
else return max;
ricerca_max_punteggio(tree->right);



}
Feedback Manager | Come funziona? | Download Software

Immagine
Avatar utente
Shanik
guru delle pelli
guru delle pelli
 
Messaggi: 2923
Iscritto il: mer ott 26, 2005 6:23 am
Località: Ariano Irpino (AV) - Fisciano (SA)

Messaggioda Travis Landon Barker il ven mag 22, 2009 6:28 pm

il tree passato all'inizio suppongo sia il puntatore al primo elemento dell'albero, vero?
Avatar utente
Travis Landon Barker
guru delle pelli
guru delle pelli
 
Messaggi: 1800
Iscritto il: dom ago 28, 2005 11:25 am

Messaggioda Travis Landon Barker il ven mag 22, 2009 6:31 pm

Ma scusa eh, premetto che gli alberi non li ho studiati, ma ho una vaga idea di come funzionino, ma quando fai:

devo fare una funzione che cerca il massimo di tutti i nodi (il contenuto dei nodi) in un albero binario NON ORDINATO..
l'ho fatta ricorsiva..
non funziona.. dice sempre che il max è in testa!!
è sicuramente un errore concettuale...
chi mi aiuta...???
questa è la funzione scritta da me..


Tnode* ricerca_max_punteggio(Ttree tree){

Tnode* max=tree;
if ((tree->left==NULL)&&(tree->right==NULL))
return max;
else
{
ricerca_max_punteggio(tree->left);
if (tree->contest.vincitore.punteggio>max->contest.vincitore.punteggio)
{

il ricerca_max_punteggio(tree->left); ti ritorna il massimo, non dovresti copiarlo in una variabile?
Avatar utente
Travis Landon Barker
guru delle pelli
guru delle pelli
 
Messaggi: 1800
Iscritto il: dom ago 28, 2005 11:25 am

Messaggioda Barattolo il ven mag 22, 2009 6:50 pm

allora...


1) indeeeentaaaaaaaahhh il codiceeeeeeee!!!! (usa pastebin o simile, alla peggio)
2) non fare fanta-tipi ... se Ttree e' sempre un Tnode*, usa solo il Tnode*!! altrimenti alla seconda riga manca il cast
3) la riga numero 3 e' rischiosa perche' potresti avere solo uno dei due a null
4) io sconsiglio l'else se gia' hai messo il return, evita indentature facilmente evitabili che rendono il codice poco leggibile
5) la funzione torna un valore, ma non lo usi mai! dovresti fare "pippo = ricerca_max_punteggio(tree->left);"
6) "max=tree; return max;" anche qui puoi condensare tutto in "return tree;" e basta
7) il secondo "ricerca_max_punteggio(tree->right);" non viene mai chiamato perche' entrambi i branch dell'if precedente finiscono con un return

intanto rifletti su questo mentre penso a come correggerla :D
Ultima modifica di Barattolo il ven mag 22, 2009 7:11 pm, modificato 1 volta in totale.
"An artist is someone who produces things that people don't need to have but that he - for some reason - thinks it would be a good idea to give them."
"Humans have a marked appreciation for beauty and aesthetics which, combined with the human desire for self-expression, has led to cultural innovations such as art, literature and music."
Confuso possessore di "un pedale del tamburo basso del doppio del cobra del ferro di Tama"
Avatar utente
Barattolo
guru delle pelli
guru delle pelli
 
Messaggi: 2529
Iscritto il: mar mar 09, 2004 7:26 pm
Località: :|

Messaggioda Barattolo il ven mag 22, 2009 7:10 pm

Dunque...

praticamente tu stai facendo una ricerca su un albero di una cosa che non sai dove stia, che, in parole povere, vuol dire: devi rovistare tutto l'albero!

dal basso del mio perverso amore per il codice ricorsivo, ho imparato che una funzione ricorsiva e' fatta almeno di questi pezzi: uno che controlla se mi devo fermare, uno che mette da qualche parte il risultato della ricerca, e uno che prosegue la ricerca.
Insomma, piu' facile a farsi che dirsi ma avere una vaga idea di quello che stai per andare a fare non fa male, specialmente col codice ricorsivo visto che stai usando una cosa che ancora devi scrivere, non e' che puoi partire dal fondo del programma e poi arrivare verso l'inizio o viceversa, insomma vabbè.

Codice: Seleziona tutto
/**
 *   Per chiarirsi le idee:
 *    Questa funzione cerca da "root" in giù, e ritorna il Tnode* che
 *    ha punteggio massimo (ma solo da root in giù appunto).
 *    In questo modo, chiamandola con la radice dell'albero alla fine
 *    avro' il Tnode* con il punteggio massimo.
 */
Tnode* ricerca_max_punteggio(Tnode* root) {

   /* Alloca due posticini per i valori che dovremo confrontare.
    * Inizializzarli al valore minimo per un intero e' una cosa
    * apprezzabile, ma non ricordo come si chiama la costante...
    */
   int valore1 = 0, valore2 = 0;
   /* Altri due spazietti per i pointer */
   Tnode* tmp1, tmp2;

   /* Questa e' un sanity check che ho messo praticamente solo
    * per farti notare che se avessi messo un else poi avrei
    * dovuto indentare tutto il resto :P
    */
   if(root == NULL) {
      return NULL;
   }

   /* Questa e' la parte che prosegue la ricerca solo se non sono
    * arrivato al fondo. Incidentalmente comprende anche il
    * controllo se mi devo fermare.
    */
   if(root->left != NULL) {
      tmp1 = ricerca_max_punteggio(root->left);
      valore1 = tmp1->contest.vincitore.punteggio;
   }
   if(root->right != NULL) {
      tmp2 = ricerca_max_punteggio(root->right);
      valore2 = tmp2->contest.vincitore.punteggio;
   }

   /*   E qui smanazzo i dati che ho trovato: */
   if(valore1 >= valore2) {
      return tmp1;
   } else {
      return tmp2;      
   }
}


vedi se ti sconquifera...
"An artist is someone who produces things that people don't need to have but that he - for some reason - thinks it would be a good idea to give them."
"Humans have a marked appreciation for beauty and aesthetics which, combined with the human desire for self-expression, has led to cultural innovations such as art, literature and music."
Confuso possessore di "un pedale del tamburo basso del doppio del cobra del ferro di Tama"
Avatar utente
Barattolo
guru delle pelli
guru delle pelli
 
Messaggi: 2529
Iscritto il: mar mar 09, 2004 7:26 pm
Località: :|

Messaggioda Marco Aquila il sab mag 23, 2009 2:53 am

:o Ragazzi non ho la più pallida di quali informazioni vi stiate scambiando ma ho paura :o
Avatar utente
Marco Aquila
Padre di Buddy Rich
Padre di Buddy Rich
 
Messaggi: 6794
Iscritto il: mer mar 22, 2006 4:07 pm
Località: Ragusa

Messaggioda Travis Landon Barker il sab mag 23, 2009 10:20 am

5) la funzione torna un valore, ma non lo usi mai! dovresti fare "pippo = ricerca_max_punteggio(tree->left);"

Infatti mi sembrava così! e inoltre, in fondo


if (tree->contest.vincitore.punteggio>max->contest.vincitore.punteggio)
{
max=tree;
return max;
}
else return max;
ricerca_max_punteggio(tree->right);
}

non viene mai neanche chiamato visto che la funzione ritorna valore max nell'if-else precedente
Avatar utente
Travis Landon Barker
guru delle pelli
guru delle pelli
 
Messaggi: 1800
Iscritto il: dom ago 28, 2005 11:25 am

Messaggioda Travis Landon Barker il sab mag 23, 2009 10:21 am

Marco Aquila ha scritto::o Ragazzi non ho la più pallida di quali informazioni vi stiate scambiando ma ho paura :o


In realtà è un codice per conquistare il mondo!

PS: scusate il doppio post
Avatar utente
Travis Landon Barker
guru delle pelli
guru delle pelli
 
Messaggi: 1800
Iscritto il: dom ago 28, 2005 11:25 am

Messaggioda Mattiadrummer il sab mag 23, 2009 11:23 am

Marco Aquila ha scritto::o Ragazzi non ho la più pallida di quali informazioni vi stiate scambiando ma ho paura :o



...mi sento una capra :cry: ...
Avatar utente
Mattiadrummer
nonno di Buddy Rich
nonno di Buddy Rich
 
Messaggi: 13400
Iscritto il: dom mag 21, 2006 11:41 pm
Località: London

Messaggioda Barattolo il sab mag 23, 2009 11:25 am

Peraltro, ho fatto una stupidata... i puntatori vanno naturalmente dichiarati così:

Tnode *tmp1, *tmp2;

con due *



comunque, Marco e Matttia, un po' vi invidio il non aver mai visto il C...
"An artist is someone who produces things that people don't need to have but that he - for some reason - thinks it would be a good idea to give them."
"Humans have a marked appreciation for beauty and aesthetics which, combined with the human desire for self-expression, has led to cultural innovations such as art, literature and music."
Confuso possessore di "un pedale del tamburo basso del doppio del cobra del ferro di Tama"
Avatar utente
Barattolo
guru delle pelli
guru delle pelli
 
Messaggi: 2529
Iscritto il: mar mar 09, 2004 7:26 pm
Località: :|

Messaggioda Mattiadrummer il sab mag 23, 2009 11:28 am

...beh cavolo..quante cose ci sarebbero da sapere...io ne so proprio poche :oops: ...
Avatar utente
Mattiadrummer
nonno di Buddy Rich
nonno di Buddy Rich
 
Messaggi: 13400
Iscritto il: dom mag 21, 2006 11:41 pm
Località: London

Messaggioda mickytaylor il sab mag 23, 2009 11:40 am

scusate l'OT ma cn il c è possibile creare un numero random come in java???
Immagine
Avatar utente
mickytaylor
maestro del groove
maestro del groove
 
Messaggi: 1047
Iscritto il: sab mag 26, 2007 12:32 pm
Località: Catania

Messaggioda Barattolo il sab mag 23, 2009 11:56 am

@Mattiadrummer:
Io programmo computer da 16 anni, alla fine e' diventato il mio lavoro. In effetti si, mi sento un po' Neo di Matrix alle volte, ma ho visto personaggi anche peggiori. In compenso non so fare un one handed roll :lol: piu' seriamente, il C ha un aspetto orrendo, ci sono un po' di concetti complicati (tipo i puntatori maledetti) che continuano a dare cazzi a programmatori di tutti i livelli, ma alla fine il suo fondamento e' che deve tutto funzionare in modo logico e meccanico, voglio dire, se scrivi "print" ti stampa una scritta, se scrivi "pippo = 3" e poi "print pippo" ti stampera' 3, e cosi' via :P

@mickytaylor
Certo che si, mi pare che le funzioni in questione siano la srand() e rand(), la prima inizializza il generatore di numeri casuali e il secondo ne genera uno. La prima prende un parametro (il "seed"), ti conviene passargli l'ora, o i nanosecondi dell'ora attuale, o una roba del genere; se gli passi un numero costante ti generera' sempre la stessa sequenza di numeri. Comunque google e' amico :P
"An artist is someone who produces things that people don't need to have but that he - for some reason - thinks it would be a good idea to give them."
"Humans have a marked appreciation for beauty and aesthetics which, combined with the human desire for self-expression, has led to cultural innovations such as art, literature and music."
Confuso possessore di "un pedale del tamburo basso del doppio del cobra del ferro di Tama"
Avatar utente
Barattolo
guru delle pelli
guru delle pelli
 
Messaggi: 2529
Iscritto il: mar mar 09, 2004 7:26 pm
Località: :|

Messaggioda Travis Landon Barker il sab mag 23, 2009 12:00 pm

mickytaylor ha scritto:scusate l'OT ma cn il c è possibile creare un numero random come in java???


Assolutamente sì.. Però per la funzione credo dipenda dal compilatore che usi..
Mi ricordo che quando usato il borland quello con la schermata blu-shocking usavo la funzione randomize(); ma mi pare che ad esempio compilando con gcc non funzionasse. Non sono sicuro però..

Cmq, come dice Barattolo, Google è amico :)
Avatar utente
Travis Landon Barker
guru delle pelli
guru delle pelli
 
Messaggi: 1800
Iscritto il: dom ago 28, 2005 11:25 am

Messaggioda Shanik il dom mag 24, 2009 10:46 pm

ciao a tutti... grazie per le risposte... chiedo scusa ma ho avuto problemi di connessione e non sono riuscito a leggere in tempo... cmq avevo risolto da solo facendo così....

Tnode* ricerca_max_punteggio(Tnode* node) {

// Base: il nodo è una foglia.

if ((node->left == NULL) && (node->right == NULL))
return node;

// Induzione: controllo se ci sono nodi con punteggio maggiore di "node".

Tnode* max = node;

if (node->left != NULL) {

// Cerco il nodo con il punteggio maggiore nel sottoalbero sinistro.

Tnode* left = ricerca_max_punteggio(node->left);

if (left->contest.vincitore.punteggio > max->contest.vincitore.punteggio)
max = left;

}

if (node->right != NULL) {

// Cerco il nodo con il punteggio maggiore nel sottoalbero destro.

Tnode* right = ricerca_max_punteggio(node->right);

if (right->contest.vincitore.punteggio > max->contest.vincitore.punteggio)
max = right;

}

return max;

}
Feedback Manager | Come funziona? | Download Software

Immagine
Avatar utente
Shanik
guru delle pelli
guru delle pelli
 
Messaggi: 2923
Iscritto il: mer ott 26, 2005 6:23 am
Località: Ariano Irpino (AV) - Fisciano (SA)

Messaggioda Shanik il dom mag 24, 2009 10:49 pm

@barottolo.. hai avuto ragione in tutto :) per l'indentatura giuro che l'ho fatta... solo il forum mi porta tutto a sinistra... non so perchè...
Feedback Manager | Come funziona? | Download Software

Immagine
Avatar utente
Shanik
guru delle pelli
guru delle pelli
 
Messaggi: 2923
Iscritto il: mer ott 26, 2005 6:23 am
Località: Ariano Irpino (AV) - Fisciano (SA)

Messaggioda kom il dom mag 24, 2009 11:09 pm

minchiamminchia io ho appena cominciato con i puntatori!
taylor per il numero casuale:
srand() imposta il seme,se come parametro usi time(NULL) usa non so quale parte dell'ora corrente. devi usare #include "time.h".
rand() genera il numero casuale compreso tra 0 e RAND_MAX,costante che puoi definire all'inizio se non vado errando,di default è un numero di merda che non ricordo. srand() va chiamata prima di rand().
whatever you do don't tell anyone
Avatar utente
kom
maestro del groove
maestro del groove
 
Messaggi: 1443
Iscritto il: mer mag 28, 2008 2:55 pm
Località: Vergate Sul Membro (LC)

Messaggioda Marco Aquila il lun mag 25, 2009 3:15 am

Mattiadrummer ha scritto:
Marco Aquila ha scritto::o Ragazzi non ho la più pallida di quali informazioni vi stiate scambiando ma ho paura :o



...mi sento una capra :cry: ...


Siamo al pascolo insieme. :cry: :cry: :cry: :cry:
Avatar utente
Marco Aquila
Padre di Buddy Rich
Padre di Buddy Rich
 
Messaggi: 6794
Iscritto il: mer mar 22, 2006 4:07 pm
Località: Ragusa

Messaggioda talismano il lun mag 25, 2009 8:35 am

ehehe io invece vi giuro che ho avuto una nostalgia assurda rileggendo questo topic...
ormai di "programmazione" nuda e cruda non fare poco o niente....

che bella che è la programmazione...
talismano
guru delle pelli
guru delle pelli
 
Messaggi: 2856
Iscritto il: lun ott 13, 2008 10:21 am

Messaggioda Fippo1992 il lun mag 25, 2009 3:17 pm

Bah, io che ho comniciato stamani con gli algoritmi ricorsivi non c'ho capito nulla :o
Comunque, in c++, per i numeri casuali:

int NumeroCasuale() //Genera un numero casuale da 1 a 10
{
int a;
srand((unsigned)time(NULL));
return a=rand()%9+1;
}


Perdonate l'indentazione, ma non me la fa... :oops:

Edit: @kom: sei sicuro che ci voglia la libreria time.h? a me funziona anche senza la libreria... e nel file in cui ho inserito srand() e rand() ho solo le librerie iostream e winbgim.h...
Affiliato con l'antagonista di discussione marcods86 ~ ALLEANZA BATTERISTI SFIGATI IN AMORE ~ Membro della "Rumorosissima Alleanza Batteristi Bonzoniani"
Immagine
Avatar utente
Fippo1992
ho il ritmo nel sangue
ho il ritmo nel sangue
 
Messaggi: 774
Iscritto il: sab ago 09, 2008 10:48 am
Località: San Romano, Montopoli in V/A, Pisa

Messaggioda John Doe il lun mag 25, 2009 3:41 pm

Ragazzi ma che errori state commettendo!! :evil: :evil:

Lo scappellamento è a destra..non a sinistra!! :D :D
"Accordatura? Tira la battente un pò meno della risonante..e inizia a suonare.." Keith Moon.
Membro della SACRA alleanza degli estimatori del nobile sport del Rugby!
Fuciliere dell'armata Drum Suond!
Cioccolato italiano...ma piatti svizzeri!
www.bestiagrama.com
Avatar utente
John Doe
guru delle pelli
guru delle pelli
 
Messaggi: 2267
Iscritto il: mar ott 10, 2006 10:25 pm
Località: Rivoli (TO)

Messaggioda kom il lun mag 25, 2009 4:24 pm

mmm non conosco quelle che hai incluso tu,probabilmente una delle due comprende anche time.h
whatever you do don't tell anyone
Avatar utente
kom
maestro del groove
maestro del groove
 
Messaggi: 1443
Iscritto il: mer mag 28, 2008 2:55 pm
Località: Vergate Sul Membro (LC)

Messaggioda Barattolo il lun mag 25, 2009 6:21 pm

rand() genera il numero casuale compreso tra 0 e RAND_MAX,costante che puoi definire all'inizio se non vado errando

non penso proprio, a meno che non la un-definisci ... e comunque credo che valga 2^15-1, ovvero 32767, che in certi compilatori e' anche il valore massimo che puo' assumere un int

@Fippo1992:
usando quella funzione ti giochi la riproducibilita' della sequenza casuale, non ti conviene fare srand() prima di ogni rand().
riguardo le funzioni ricorsive, beh, si, sono una brutta faccenda, tanto piu' che non si usano quasi mai ... pero' sono istruttive, e poi per me hanno un non so che di affascinante :P
"An artist is someone who produces things that people don't need to have but that he - for some reason - thinks it would be a good idea to give them."
"Humans have a marked appreciation for beauty and aesthetics which, combined with the human desire for self-expression, has led to cultural innovations such as art, literature and music."
Confuso possessore di "un pedale del tamburo basso del doppio del cobra del ferro di Tama"
Avatar utente
Barattolo
guru delle pelli
guru delle pelli
 
Messaggi: 2529
Iscritto il: mar mar 09, 2004 7:26 pm
Località: :|

Messaggioda francesco- il lun mag 25, 2009 6:25 pm

avete provato con il cinese? forse e` piu facile... :D
Devoto Membro della "Rumorosissima Alleanza Batteristi Bonzoniani"
Membro della "singolare alleanza batteristi monopedalistici"
Avatar utente
francesco-
maestro del groove
maestro del groove
 
Messaggi: 1384
Iscritto il: ven ago 17, 2007 5:08 pm

Messaggioda Fippo1992 il lun mag 25, 2009 7:05 pm

@barattolo: so che il mio codice non era fatto granchè bene, era solo per spiegare come funzionava in un contesto... semi-serio.
Comunque mi ci sono emsso un po' oggi pomeriggio e ci sto capendo qualcosa... sono mooolto carine... per esercizio dovrei scrivere la successione di fibonacci con la ricorsione... ma a malapena scrivo la media aritmetica XD
Affiliato con l'antagonista di discussione marcods86 ~ ALLEANZA BATTERISTI SFIGATI IN AMORE ~ Membro della "Rumorosissima Alleanza Batteristi Bonzoniani"
Immagine
Avatar utente
Fippo1992
ho il ritmo nel sangue
ho il ritmo nel sangue
 
Messaggi: 774
Iscritto il: sab ago 09, 2008 10:48 am
Località: San Romano, Montopoli in V/A, Pisa


http://www.youtube.com/watch?v=NP5_CJg7oKQ

Torna a Tutto il resto

Chi c’è in linea

Visitano il forum: Nessuno e 4 ospiti