Newsgroup: it.comp.lang.visual-basic
Titolo: Un bel problema per chi ha voglia di ragionare

Ecco un bel problemino di programmazione pura, che mi attanaglia da due
giorni, destinato a chi ha voglia di ragionare.
Arrivo subito al dunque: 
Supponiamo di avere una struttura ad albero (per fissare le idee pensate ad
una struttura simile a quella del registro di configurazione).
La struttura è di questo genere:
nodo1
    |	
    |__nodo11
    |	|__nodo211
    |       |	
    |	|__nodo212        		
    |	        |
    |	        |__nodo3121	
    |__nodo12
    |	|__nodo221
ecc.
Il fatto è che non si sà esattamente come è costituito l'albero, sopratutto
non si sà quanto è profondo (proprio come il registro di configurazione).
Oltre ai vari strumenti "concessi" dal basic, abbiamo anche due funzioni:
NumeroNodi (<nodo>)
restituisce il numero di nodi contenuti nel nodo il cui indirizzo è <nodo>.
Per esempio se focalizziamo il nodo 11 della figura avremo:
x = NumeroNodi(nodo1\nodo11)  ---> x= 2
Notate che l'indirizzo è strutturato come il path (per il nodo212 sarebbe
nodo1\nodo11\nodo212) e che la funzione restituisce solamente il numero di
nodi immediatamente contenuti nel nodo specificato, e non anche il numero
di quelli contenuti in questi.
IndirizzoNodi (<nodo>) --> questa funzione restituisce una matrice
contenente i nomi dei nodi contenuti in certo nodo. Per esempio, sempre per
il nodo 11, avremo:
x=IndirizzoNodi(nodo1\nodo11)  ---> x(1)=nodo211 x(2)=nodo212
Notate che non viene restituito tutto l'indirizzo del nodo, ma solo il
nome.
Se siete arrivati fino a qui, e avete capito tutto, posso porre la
richiesta del problema:
Quanti sono i nodi contenuti in nodo1 ? 
Si tenga conto che il calcolo deve essere fatto privilegiando la pofondità,
cioè:
non n° nodi contenuti in nodo1+ n° in nodo11+ n° in nodo12 + n° in
nodo211+...

nodo211+...
Allora qui entra in gioco la ricorsione.
Facciamo la funzione     ContaNodi( nomenodo as string ) as integer 
che dato il nome del nodo restituisce il numero dei nodi contenuti
e dei filgli.
L'ho scritta cosi' a braccio non l'ho provato.
Function ContaNodi( nomenodo as string ) as integer
Noditot as integer
Nodifilgi as integer
contfigli as integer
Noditot = 0
'Leggo il numero dei nodi contenuti.
Nodifigli = NumeroNodi ( nomenodo )
'Leggo i nmi dei figli
if Nodifigli > 0 then
	x=IndirizzoNodi( nomenodo )
	' Diaciamo che in x otteniamo i nomi dei figli.
	'---> x(1)=nodo211 x(2)=nodo212
end if
contfigli = 0
'Per ogni filgio conto i nodi sotto di lui
for F = 1 to Nodifigli 
	'Calcolo il nome del filgio esteso
	nomefiglio = nomenodo+"\"+x(f)
	configli = configli + ContaNodi( nomefiglio )	
next F
ContaNodi = NodiFigli + contfigli
end Function
Per eseguire il calcolo devi chiamare
risultato = ContaNodi( "nodo1" )
Spero ti sia di aiuto almeno.
Ciao
Vincenzo Giordano  Bologna Italy 
e-mail:vinc...@iol.it
Remember        :"If you have got problem with your conscience...change it!"
Ricorda         :"Se hai problemi di coscienza...cambiala !"

Ok ragazzi, ho risolto !
Ho fatto una funzione ricorsiva (anche abbastanza semplice) che mi consente
di ricavare tutte le informazioni di cui ho bisogno.
Un grazie a chi ha risposto al mio ng.
Se qualc'uno ha bisogno della funzione in questione, me lo faccia sapere.
	Ciao e grazie ancora,
 
			Nicola
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|   Guru's Home Page: 
http://www.geocities.com/SiliconValley/Vista/8323/
 
| 	
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~