PDA

Visualizza la versione completa : Significato della forma if-else contratta


ReverendoVerde
07-06-2017, 21:02
Salve avrei bisogno di aiuto a compredere questo codice:

public int contaFoglie() {
return (left.empty() && right.empty()) ? 1 : left.contaFoglie()+right.contaFoglie();
}
è un semplice metodo che conta le foglie in un albero di ricerca.
Il mio problema sta nel capire come agisce, nel senso: Se left e right sono empty, mi ritorna 1 perchè vuol dire che c'è solo la radice. Se invece ci sono altri nodi? Non capisco quel "+" in mezzo alle chiamate di left.contaFoglie() e right.contaFoglie(). E' come se nel ramo else fossero messi in colonna quindi prima finisce di controllare il ramo Left e poi esegue right.contaFoglie()? E poi, come avviene il conteggio? Usando una classe di testing funziona ma non capisco dove salvi o come conteggi il numero di foglie.
Grazie per un eventuale risposta

MItaly
08-06-2017, 01:17
L'operatore ternario ha precedenza molto bassa, per cui è come se quell'espressione fosse scritta come:


return (left.empty() && right.empty()) ? 1 : (left.contaFoglie()+right.contaFoglie());

ovvero


int ret;
if(left.empty() && right.empty())
ret = 1;
else
ret = left.contaFoglie() + right.contaFoglie();
return ret;

Il + è semplicemente il normale operatore di somma; non ho capito cosa ci sia da "mettere in colonna".

ReverendoVerde
08-06-2017, 02:32
Il + è semplicemente il normale operatore di somma; non ho capito cosa ci sia da "mettere in colonna".

Grazie per la risposta e per avermi fatto capire come viene letto.
Però mi sorge un'altra domanda perchè evidentemente non ho capito il funzionamento di questa chiamata ricorsiva.
Prendendo il codice esteso che hai scritto, nella variabile "ret" cosa viene salvato? Cioè il risultato di left.contaFoglie() + right.contaFoglie() quale potrebbe essere? Mi spiego, quel "+" cosa fa? Esegue prima left.contaFoglie() fino a trovare il numero di foglie, poi esegue rigth.contaFoglie e somma i due risultati?

Grazie ancora per aver risposto

LeleFT
08-06-2017, 09:38
Sì. Prima vengono contate le foglie del ramo a sinistra e poi vengono contate le foglie del ramo di destra... il risultato è la somma dei due.


Ciao. :ciauz:

Shores
08-06-2017, 11:40
Forse un elemento chiarificatore che manca è che si tratta di un codice ricorsivo: chiamando la funzione sulla radice, questa richiamerà se stessa per i due nodi figli di destra e sinistra, e ciascuno di essi la richiamerà per i 4 nipoti e così via, fino a quando si arriva alle foglie, che, non avendo figli, restituiscono 1 senza fare ulteriori chiamate; a questo punto si risale nell'albero delle chiamate, e il risultato viene composto.

MItaly
09-06-2017, 00:20
Sospetto che sia più un problema di comprensione di fondo di come vengono valutate le espressioni... :confused:

Loading