Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Mova Z70 Ultra Roller Complete: motore potente, rullo di lavaggio e l'IA a guidare
Mova Z70 Ultra Roller Complete: motore potente, rullo di lavaggio e l'IA a guidare
Mova Z70 Ultra Complete è un robot aspirapolvere che coniuga un'aspirazione potente e un lavaggio con rullo a logica di intelligenza artificiale che guida al meglio nella pulizia di casa: rulli e spazzole estensibili a pulire gli angoli e una base di ricarica che lava e ripristina il robot al emglio delle sue funzionalità dopo ogni azione di pulizia
Recensione Google Pixel 11: non ha l'HiLight dei Pro, ma è il Pixel più equilibrato di sempre
Recensione Google Pixel 11: non ha l'HiLight dei Pro, ma è il Pixel più equilibrato di sempre
Abbiamo provato Google Pixel 11, il più accessibile della nuova gamma: chip Tensor G6 condiviso con i modelli Pro, fotocamera 48 MP con Magic Capture e Stili Fotografici, display Actua da 3000 nit e batteria da 4985 mAh. Ecco come si comporta nell'uso quotidiano, e cosa cambia davvero rispetto a Pixel 11 Pro e Pro XL
Google Pixel 11 Pro XL: fotocamera al top, batteria indietro. Luci e ombre del nuovo flagship
Google Pixel 11 Pro XL: fotocamera al top, batteria indietro. Luci e ombre del nuovo flagship
Google Pixel 11 Pro XL debutta in Italia con il nuovo Tensor G6, lo Zoom Pro fino a 120x, il display Super Actua da 3600 nit e la new entry HiLight riservata ai modelli Pro: lo abbiamo provato in anteprima per diversi giorni prima del lancio commerciale, tra fotocamera generativa, ricarica ancora indietro rispetto ai rivali e un prezzo che parte da 1399 euro
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 04-05-2005, 15:03   #1
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
[C, alberi binari, liste] problema

realizzare una funzione (una sola!) che presi in input un albero binario e una lista verifica che l'altezza dell'albero sia minore della lunghezza della lista.
questo era un eserciuìzio di un esonero di un corso di Programmazione 2; voi come fareste?
naturalmente il fatto che sia esplicitamente specificato di usare una sola funzione lascia intendere che per calcolare l'altezza dell'albero si debba usare un algoritmo iterativo.
come al solito, io la soluzione la so già ma pongo ugualmente la sfida 1) per vedere come se la cava cionci (spero che accetti la sfida), e 2) per confrontare le vostre soluzioni con la mia; ah, e anche 3) per avere una maggiore certezza di non aver scritto troppe cazzate a quell'esonero

Ultima modifica di 71104 : 04-05-2005 alle 15:07.
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 04-05-2005, 18:54   #2
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Perchè non può essere ricorsivo
Comunque ho visto solo ora...domani ci provo...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 04-05-2005, 21:15   #3
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da cionci
Perchè non può essere ricorsivo
ok, può anche essere ricorsivo, ma deve comunque essere una sola funzione; e cmq il prof. l'ha anche detto che possibilmente doveva essere iterativo (considera che in genere gli algoritmi iterativi sono preferibili a quelli ricorsivi).
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 04-05-2005, 21:21   #4
Manugal
Senior Member
 
L'Avatar di Manugal
 
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
Ma guarda un pò.........

Anch'io avevo il compito B oggi sai? L'ho fatto un pò alla mia maniera infatti non so se è giusto spero di averlo passato l'ho fatti tutti.

Io mandato una lista e un albero in input e poi ho fatto lo scorrimento dell'albero ricorsivamente sul sottoalbero sinistro e destro e ho aumentato un contatore chiamato cntalbero. Poi ho iniziato a scorrere gli elementi della lista e anche lì ho usato un contatore chiamato cntlista. Alla fine ho semplicemente confrontato i contatori e il più piccolo ha restituito VERO.
Manugal è offline   Rispondi citando il messaggio o parte di esso
Old 04-05-2005, 21:49   #5
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da Manugal
Ma guarda un pò.........

Anch'io avevo il compito B oggi sai? L'ho fatto un pò alla mia maniera infatti non so se è giusto spero di averlo passato l'ho fatti tutti.
LOL
li ho fatti tutti anche io ma penso di aver toppato il bonus (vabbè, niente bonus x me ).

cmq mezzo Dipartimento di Informatica della Sapienza viene qui su HwUpgrade... mi sembra che fosse Andrea Cosentino l'altro che si era iscritto qualche mese fa; tu chi sei?
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 05-05-2005, 07:52   #6
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
L'albero è bilanciato ?
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 05-05-2005, 08:36   #7
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Lo suppongo non bilanciato e che sia memorizzato nella struttura classica con figlioSX e figlioDX...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 05-05-2005, 09:59   #8
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Fatto:
Codice:
struct list {
	int info;
	struct list *next;
};

typedef struct list lista;


struct alb {
	int info;
	struct alb *sx;
	struct alb *dx;
};

typedef struct alb albero;

struct list_alb {
	albero *corrente;
	int visitato;
	int alt;
	struct list_alb *sx;
	struct list_alb *dx;
	struct list_alb *prev;
};

typedef struct list_alb lista_alb;

/*ritorna 1 se è minore, 0 altrimenti*/
int confronta(albero *a, lista *l)
{
	int lun_lista = 1;
	int lun_albero = 1;
	lista_alb *la;
	lista_alb *cur;
	lista_alb *tmp;

	if(!a && l) return 1;
	if(a && !l) return 0;

	while(l->next)
	{
		l = l->next;
		lun_lista++;
	}

	cur = la = (lista_alb *)malloc(sizeof(lista_alb));
	cur->prev = cur->dx = cur->sx = NULL;

	cur->corrente = a;
	cur->alt = 1;
	cur->visitato = 0;

	do {

		if((!cur->corrente->dx && !cur->corrente->sx) || cur->visitato == 2)
		{
			cur->visitato = 2;
			if(cur->alt > lun_albero)
				lun_albero = cur->alt;
			
			if(cur->prev) 
			{
				tmp = cur;
				cur = cur->prev;
				cur->visitato++;
                free(tmp);
			}
			continue;
		}

		switch(cur->visitato)
		{
		case 0:
			if(cur->corrente->sx)
			{
				tmp = (lista_alb *)malloc(sizeof(lista_alb));
				tmp->alt = cur->alt + 1;
				tmp->visitato = 0;
				tmp->prev = cur;
				tmp->corrente = cur->corrente->sx;
				tmp->sx = tmp->dx = NULL;
				cur->sx = tmp;
			}
			if(cur->corrente->dx)
			{
				tmp = (lista_alb *)malloc(sizeof(lista_alb));
				tmp->alt = cur->alt + 1;
				tmp->visitato = 0;
				tmp->prev = cur;
				tmp->corrente = cur->corrente->dx;
				tmp->sx = tmp->dx = NULL;
				cur->dx = tmp;
			}
			if(!cur->corrente->dx)
			{
				cur->visitato++;
				cur = cur->sx;
			}
			else
				cur = cur->dx;
			break;
		case 1:
			if(cur->sx) cur = cur->sx;
			else cur->visitato++;
			break;
		}

	} while(la->visitato < 2);
	free(la);
	return (lun_albero < lun_lista) ? 1 : 0;
}
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 05-05-2005, 11:58   #9
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da cionci
Fatto:[...]
vedo che hai usato dei nodi d'appoggio che sono una fusione tra quelli dell'albero e quelli della lista; inoltre vedo che questi nodi contengono un flag (visitato) che risolve il problema dell'assenza dello stack durante la visita dell'albero (cioè permette di fare un algoritmo iterativo anziché ricorsivo); complimenti, ottima soluzione!
io ho fatto diversamente: per rimediare all'assenza dello stack durante la visita dell'albero ho usato una variabile d'appoggio (chiamiamola "provenienza") che ogni volta che il nodo corrente si setta su un'altra posizione, mi indica da dove "proviene" il nodo corrente, cioè se la posizione precedente a quella corrente era il padre, il figlio sx o il figlio dx del nodo corrente; ho fatto tutto dentro un ciclo, più o meno così:

Codice:
typedef struct _TNODE {  // tree node
    int data;
    struct _TNODE *p, *l, *r;
} TNODE, *PTNODE;

//...

int h = 0;  // altezza dell'albero
int i = 0;  // contatore altezza
PTNODE n = ...; //n viene inizializzato alla radice dell'albero
while (n) {
	switch (provenienza) {
	case 0:  // n prima era il padre
		if (n->l) {
			provenienza = 0;
			n = n->l;
			if (++i > h) h = i;
			break;
		}
		else {
			provenienza = 1;
		}
	case 1:  // n prima era il figlio sinistro
		if (n->r) {
			provenienza = 0;
			n = n->r;
			if (++i > h) h = i;
			break;
		}
		else {
			provenienza = 2;
		}
	case 2:  // n prima era il figlio destro
		if (n->p) {
			if (n == n->p->l) {
				provenienza = 1;
			}
			else {
				provenienza = 2;
			}
			n = n->p;
			i--;
		}
		break;
	}
}
ho usato alberi doppiamente linkati (cioè ogni nodo conosce anche il padre) altrimenti non ne uscivo fuori ^^' il prof. ha detto che andava bene.

PS: cmq si, l'albero non doveva essere supposto bilanciato (altrimenti era na cazzata bastava scendere su tutti i left o su tutti i right e contare finché non trovavi NULL in pratica diventava il conteggio di due liste).
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 05-05-2005, 12:02   #10
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Se era doppiamente linkato era più facile...infatti ho costruito proprio quella struttura per permettermi di andare avanti ed indietro nell'albero...
cionci è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Mova Z70 Ultra Roller Complete: motore potente, rullo di lavaggio e l'IA a guidare Mova Z70 Ultra Roller Complete: motore potente, ...
Recensione Google Pixel 11: non ha l'HiLight dei Pro, ma è il Pixel più equilibrato di sempre Recensione Google Pixel 11: non ha l'HiLight dei...
Google Pixel 11 Pro XL: fotocamera al top, batteria indietro. Luci e ombre del nuovo flagship Google Pixel 11 Pro XL: fotocamera al top, batte...
Non sai programmare? Ecco cosa si può fare con un LLM e una GeForce RTX 5070 Ti Non sai programmare? Ecco cosa si può far...
Recensione Samsung Galaxy Z Fold8 Ultra: il pieghevole più famoso diventa quasi perfetto Recensione Samsung Galaxy Z Fold8 Ultra: il pieg...
22 offerte Amazon da non perdere, dalla ...
Bose QuietComfort Earbuds a 129,95€: ANC...
L'unico con tante scorte, non fatevi sca...
Torna il super doppio sconto sulle e-bik...
Offerte Amazon componenti PC: RTX 5060 T...
Crucial Pro DDR5 da 32GB a 389,99€: perc...
Fable 5, il modello più potente d...
PC all-in-one Lenovo super elegante, per...
Lo Smart TV più venduto su Amazon...
Periferiche gaming in offerta su Amazon:...
L'IA non è una bolla, ma pu&ograv...
Il cinema in salotto: oggi TV Xiaomi QLE...
Passa a ho. Mobile, fino a fine agosto c...
Ai Giochi di Pechino i robot prendono fu...
Arianespace Ariane 6: lanciato il satell...
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: 09:10.


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