Visualizzazione dei risultati da 1 a 10 su 21

Hybrid View

  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    339
    Ho provato a buttar giù del codice... è giusto ?
    codice:
    public static boolean verifica(AlberoBinario a){
    if(a==null) return false;
    if(a.sinistro() == null && a.destro() == null){
    if(a.val() >=0) return true;
    else{
    boolean b = verifica(a.destro());
    if (!b) return verifica(a.sinistro());
    }
    }

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Markus85 Visualizza il messaggio
    Ho provato a buttar giù del codice... è giusto ?
    No, non è giusto. Testi if(a.sinistro() == null && a.destro() == null) (che testa se a è "foglia") e poi dentro il corpo del if vai in ricorsione (che non ha senso perché per la condizione del if sarebbe una foglia).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    339
    Mmmm....

    Provo a riscrivere il codice :

    codice:
    public static boolean verifica(AlberoBinario a){
     if(a==null) return false;
      if(a.sinistro()==null && a.destro()==null){
        if(a.val()>=0) return true;
      }
      else{
         boolean b = verifica(a.destro());
          if(!b) return verifica(a.sinistro());
      }
     return false;
    }
    Ultima modifica di Markus85; 16-10-2018 a 17:45

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Markus85 Visualizza il messaggio
    Mi puoi correggere il codice?

    Dove devo fare la ricorsione?
    Il primo test del a==null è assolutamente giusto/sensato.

    Poi dovrai testare se è una foglia (entrambi sinistro/destro a null). Se è una foglia, testi la condizione specifica sul valore. In base alla condizione, restituisci SUBITO true o false (non serve un if ... basta l'espressione della condizione). Questo perché è una foglia ... non hai nulla sotto.

    Se non sei entrato nel if della foglia .... allora NON è una foglia. Quindi:
    - se c'è il sinistro, entri ricorsivamente nel sinistro
    - se c'è il destro, entri ricorsivamente nel destro

    C'è una considerazione da fare: entrambe le chiamate ricorsive restituiscono un boolean. Cosa restituisci al "di sopra"? Semplice: tu hai detto "almeno una delle foglie". Quindi se dal sinistro ottieni già true, non hai più da entrare nel destro!

    Se né dal sinistro, né dal destro ottieni un true .... ovviamente restituisci false.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    339
    Vediamo...ci riprovo :
    codice:
    public static boolean verifica(AlberoBinario a){
     if(a==null) return false;
      if(a.destro()==null && a.sinistro()==null){
        if(a.val()>=0) return true;
         else return false;
      }
      else{
        boolean b = verifica(a.destro());
         if(!b) return verifica(a.sinistro());
      }
     return false;
    }

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Markus85 Visualizza il messaggio
    Vediamo...ci riprovo
    No, non ancora. Innanzitutto nel caso di foglia puoi semplificare il return. Dicevo prima: non serve per forza un if .... hai l'espressione della condizione che è .... un boolean!

    Nella parte finale, neanche. Va bene sfruttare quel a==null iniziale per poter invocare comunque verifica ricorsivamente. Ma se b è true, non restituisci al chiamante true!

    E nella parte finale puoi comunque semplificare molto: quale è quell'operatore che verifica se almeno uno dei due operandi è true e se il primo è true NON valuta il secondo operando?
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    339
    Beh...Mi butteresti quattro righe di codice?
    Giusto per avere maggior chiarezza della soluzione.

    Intanto ci riprovo nuovamente :-)

    codice:
    public static boolean verifica(AlberoBinario a){
      if(a==null) return false;
       if(a.sinistro()==null && a.destro()==null) return a.val()>=0;
        else{
          boolean b = verifica(a.destro());
           if(!b) return verifica(a.sinistro());
        }
       return true;
    }
    Ultima modifica di Markus85; 16-10-2018 a 18:23

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 © 2026 vBulletin Solutions, Inc. All rights reserved.