Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    Significato della forma if-else contratta

    Salve avrei bisogno di aiuto a compredere questo codice:
    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

  2. #2
    L'operatore ternario ha precedenza molto bassa, per cui è come se quell'espressione fosse scritta come:
    codice:
    return (left.empty() && right.empty()) ? 1 : (left.contaFoglie()+right.contaFoglie());
    ovvero
    codice:
    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".
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Quote Originariamente inviata da MItaly Visualizza il messaggio
    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

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    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.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    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.
    "Le uniche cose che sbagli sono quelle che non provi a fare."
    Atipica

  6. #6
    Sospetto che sia più un problema di comprensione di fondo di come vengono valutate le espressioni...
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.