Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Google Pixel 10 è compatto e ha uno zoom 5x a 899€: basta per essere un best-buy?
Google Pixel 10 è compatto e ha uno zoom 5x a 899€: basta per essere un best-buy?
Google Pixel 10 è uno smartphone che unisce una fotocamera molto più versatile rispetto al passato grazie allo zoom ottico 5x, il supporto magnetico Pixelsnap e il nuovo chip Tensor G5. Il dispositivo porta Android 16 e funzionalità AI avanzate come Camera Coach, mantenendo il design caratteristico della serie Pixel con miglioramenti nelle prestazioni e nell'autonomia. In Italia, però, mancano diverse feature peculiari basate sull'AI.
Prova GeForce NOW upgrade Blackwell: il cloud gaming cambia per sempre
Prova GeForce NOW upgrade Blackwell: il cloud gaming cambia per sempre
L'abbonamento Ultimate di GeForce NOW ora comprende la nuova architettura Blackwell RTX con GPU RTX 5080 che garantisce prestazioni tre volte superiori alla precedente generazione. Non si tratta solo di velocità, ma di un'esperienza di gioco migliorata con nuove tecnologie di streaming e un catalogo giochi raddoppiato grazie alla funzione Install-to-Play
Ecovacs Deebot X11 Omnicyclone: niente più sacchetto per lo sporco
Ecovacs Deebot X11 Omnicyclone: niente più sacchetto per lo sporco
Deebot X11 Omnicyclone implementa tutte le ultime tecnologie Ecovacs per l'aspirazione dei pavimenti di casa e il loro lavaggio, con una novità: nella base di ricarica non c'è più il sacchetto di raccolta dello sporco, sostituito da un aspirapolvere ciclonico che accumula tutto in un contenitore rigido
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 20-09-2011, 09:50   #1
mame83
Member
 
Iscritto dal: Nov 2010
Messaggi: 71
[C]funzione verificare se un albero binario è un abr

Ciao a tutti ho il seguente problema : dato un albero binario devo scrivere una funzione ricorsiva che restituisce 0 se l albero è un ABR , 1 se non lo è.
La soluzione che avevo pensato ma non riesco ad applicare è quella di utilizzare la visita in ordine e verificare se la successione è crescente. Quindi utilizzando una funzione dove gli passerò due parametri var1 e var2 e verifico di chiamata in chiamata se var1 è minore o uguale di var2 appena var1 è maggiore di var2 dovrei uscire e ritornare 1 se no vado avanti.

Spero di essere stato chiaro nell esposizione del problema e che qualcuno mi aiuti GRAZIE!!!!!!!!

Codice:
int ABR(nod *radice, int *b)/*0 se è un abr, 1 se non lo è*/
{
 int confronto;
 if (radice!=NULL)
   {
     confronto=ABR(radice->sinistro,&(radice->info));
     printf("valore di radice e' %d \n",radice->info);
     printf("valore di b e' %d \n",*b);
     if (radice->info>(*b))
       return 1;/*dobbiamo uscire visto che il precedente è minore del successivo*/
     else
       confronto=0;  /*vado avanti*/
     confronto=ABR(radice->destro,&(radice->info));
   }
 return confronto; 
 
}
B lo inizializzo nel main con un valore piu grande che non posso mai inserire nell albero.
mame83 è offline   Rispondi citando il messaggio o parte di esso
Old 20-09-2011, 17:08   #2
mame83
Member
 
Iscritto dal: Nov 2010
Messaggi: 71
ragazzi vi prego aiutatemi!!!!!!!
mame83 è offline   Rispondi citando il messaggio o parte di esso
Old 20-09-2011, 18:07   #3
mame83
Member
 
Iscritto dal: Nov 2010
Messaggi: 71
in output mi restituisce sempre 1 anke quando è un abr. qualcuno mi sa aiutare
mame83 è offline   Rispondi citando il messaggio o parte di esso
Old 21-09-2011, 02:27   #4
Floris
Senior Member
 
L'Avatar di Floris
 
Iscritto dal: Jan 2007
Messaggi: 2267
Codice:
class node{
	public:
		int info;
		node* first;
		node* second;
        node(int i,node* f, node* s):info(i),first(f),second(s){}
};

bool testNode(node* n){
	bool isOk = true;
	if(n->first!=0)
		isOk = n->first->info <= n->info;
        if(n->second!=0)
		isOk = isOk && n->info <= n->second->info;
        return isOk;
}

bool testABR(node* root){
	if(root == 0) return true;
	return testNode(root) && testABR(root->first) && testABR(root->second);
}
Credo che nel tuo codice l'errore sia alla fine dove dovresti porre
Codice:
confronto=confronto || ABR(radice->destro,&(radice->info));
__________________
Concluso con:...
Floris è offline   Rispondi citando il messaggio o parte di esso
Old 21-09-2011, 09:40   #5
mame83
Member
 
Iscritto dal: Nov 2010
Messaggi: 71
Quote:
Originariamente inviato da Floris Guarda i messaggi
Codice:
class node{
	public:
		int info;
		node* first;
		node* second;
        node(int i,node* f, node* s):info(i),first(f),second(s){}
};

bool testNode(node* n){
	bool isOk = true;
	if(n->first!=0)
		isOk = n->first->info <= n->info;
        if(n->second!=0)
		isOk = isOk && n->info <= n->second->info;
        return isOk;
}

bool testABR(node* root){
	if(root == 0) return true;
	return testNode(root) && testABR(root->first) && testABR(root->second);
}
Credo che nel tuo codice l'errore sia alla fine dove dovresti porre
Codice:
confronto=confronto || ABR(radice->destro,&(radice->info));
Scusa la mia ignoranza in materia. ma il codice che hai scritto non l ho capito. non è C vero?
mame83 è offline   Rispondi citando il messaggio o parte di esso
Old 21-09-2011, 12:00   #6
EnergyVortex
Member
 
Iscritto dal: Aug 2009
Messaggi: 287
non basta fare una visita inorder e controllare che i valori siano sempre crescenti?
EnergyVortex è offline   Rispondi citando il messaggio o parte di esso
Old 21-09-2011, 12:16   #7
mame83
Member
 
Iscritto dal: Nov 2010
Messaggi: 71
e questo che voglio. ma come posso fare??? dove sbaglio nella mia funzione?
mame83 è offline   Rispondi citando il messaggio o parte di esso
Old 21-09-2011, 16:14   #8
EnergyVortex
Member
 
Iscritto dal: Aug 2009
Messaggi: 287
io farei così:
void verifica(struct nodo *radice, int *max, int* abr) //se abr è 0 è un ABR
{
verifica(radice->sx,max,abr);
int appoggio;
if (radice!=NULL)
{
appoggio=radice->info;
if (appoggio<max)
*abr=1;
*max=appoggio;
}
verifica(radice->dx,max,abr);
}
EnergyVortex è offline   Rispondi citando il messaggio o parte di esso
Old 21-09-2011, 19:11   #9
mame83
Member
 
Iscritto dal: Nov 2010
Messaggi: 71
scusa max lo inizializzo a 0 o ad un valore grande??
mame83 è offline   Rispondi citando il messaggio o parte di esso
Old 21-09-2011, 19:51   #10
Floris
Senior Member
 
L'Avatar di Floris
 
Iscritto dal: Jan 2007
Messaggi: 2267
Quando quoti un listato lungo di codice senza apportarne modifiche, fai così:
Quote:
Originariamente inviato da Floris
Codice:
class node{
	public:
		int info;
...
Per non rendere il thread dispersivo.

In ogni caso il codice è in C++. In C sarebbe una cosa del genere:
Codice:
struct node{
	int info;
	node* first;
	node* second;
};

bool testNode(node* n){
	bool isOk = true;
	if(n->first!=0)
		isOk = n->first->info <= n->info;
        if(n->second!=0)
		isOk = isOk && n->info <= n->second->info;
        return isOk;
}

bool testABR(node* root){
	if(root == 0) return true;
	return testNode(root) && testABR(root->first) && testABR(root->second);
}
Inoltre vengono usati i valori booleani. true equivale a 1 e false a 0. Il test n->first!=0 equivale a n->first!=NULL.
Quindi per avere i valori che vuoi tu basta che fai !testABR(radice), così ti ritorna 0 (false) se è ABR e 1 (true) se non lo è.
Per il resto è una normale visita ricorsiva infissa dell'albero. Facendo così eviti di dover utilizzare variabili ausiliarie.
Inoltre la cortocircuitazione dell'operatore && garantisce che appena viene trovato un valore che non rispetta la definizione
di ABR, la ricorsione si chiude. (nel caso non sapessi cosa significa che l'operatore binario && è cortocircuitato, significa che se si ha A && B,
all'atto della valutazione se A è true allora viene valutato anche B, mentre se A è false allora B non viene valutato poichè
A && B è in ogni caso false. Stessa cosa per l'operatore binario ||)

Se vuoi una visita prefissa, basta porre:
Codice:
return testABR(root->first) && testNode(root) && testABR(root->second);
__________________
Concluso con:...

Ultima modifica di Floris : 21-09-2011 alle 20:07.
Floris è offline   Rispondi citando il messaggio o parte di esso
Old 23-09-2011, 19:59   #11
EnergyVortex
Member
 
Iscritto dal: Aug 2009
Messaggi: 287
Quote:
Originariamente inviato da mame83 Guarda i messaggi
scusa max lo inizializzo a 0 o ad un valore grande??
a 0 se l'albero contiene solo valori positivi, altrimenti al massimo numero negativo rappresentabile con un int
EnergyVortex è offline   Rispondi citando il messaggio o parte di esso
Old 24-09-2011, 09:58   #12
mame83
Member
 
Iscritto dal: Nov 2010
Messaggi: 71
Quote:
Originariamente inviato da EnergyVortex Guarda i messaggi
io farei così:
void verifica(struct nodo *radice, int *max, int* abr) //se abr è 0 è un ABR
{
verifica(radice->sx,max,abr);
int appoggio;
if (radice!=NULL)
{
appoggio=radice->info;
if (appoggio<max)
*abr=1;
*max=appoggio;
}
verifica(radice->dx,max,abr);
}
L ho provato a fare come dici. ma va in loop.
ho inizializzato nel main max e abr a 0
Codice:
void verifica(struct nodo *radice, int *max, int* abr) //se abr è 0 è un ABR
{
  verifica(radice->sinistro,max,abr);
  int appoggio;
  if (radice!=NULL)
    {
      appoggio=radice->info;
      if (appoggio<*max)
         *abr=1;
      *max=appoggio;
        
    }
    
  verifica(radice->destro,max,abr);
}
mame83 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Google Pixel 10 è compatto e ha uno zoom 5x a 899€: basta per essere un best-buy? Google Pixel 10 è compatto e ha uno zoom ...
Prova GeForce NOW upgrade Blackwell: il cloud gaming cambia per sempre Prova GeForce NOW upgrade Blackwell: il cloud ga...
Ecovacs Deebot X11 Omnicyclone: niente più sacchetto per lo sporco Ecovacs Deebot X11 Omnicyclone: niente più...
Narwal Flow: con il mocio orizzontale lava i pavimenti al meglio Narwal Flow: con il mocio orizzontale lava i pav...
Panasonic 55Z95BEG cala gli assi: pannello Tandem e audio senza compromessi Panasonic 55Z95BEG cala gli assi: pannello Tande...
Novità dalle analisi dell'asteroi...
La PS6 sarà più potente del previsto: ec...
Sony svela Xperia 10 VII: è il nu...
Amazon Weekend da urlo: iPhone 16 a prez...
Spotify diffida ReVanced: chiesta la rim...
Spazzolini elettrici Oral-B iO in super ...
Samsung Galaxy Watch8 Classic e Watch7 a...
Blue Origin prosegue lo sviluppo di Blue...
Roborock Saros 10 e 10R dominano il merc...
Apple scatenata su Amazon: tutti gli sco...
Canon EOS C50 è la nuova videocam...
ASUS ProArt P16 arriva in Italia: la wor...
Fujifilm presenta l'obiettivo FUJINON GF...
Il grafene ha appena 'infranto' una legg...
Metroid Prime Beyond: arriva un trailer ...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 17:24.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v