Visualizzazione dei risultati da 1 a 7 su 7

Discussione: Fermare la ricorsione

  1. #1
    Utente di HTML.it L'avatar di cerza
    Registrato dal
    Oct 2009
    Messaggi
    310

    Fermare la ricorsione

    Salve,
    ho questo metodo ricorsivo:

    codice:
     private void treeSplit2(Collection<Set<INodo>> result, String string){
    Iterator<Set<INodo>> it = result.iterator(); 
     while (it.hasNext() && !verify) {
    
    
        Set<INodo> singoleSet = it.next();
    
    
        for (INodo originNode : singoleSet) {
    
    
        
                int position = originNode.getPositionSymbol();
                position++;
    
    
                if (originNode.getEdge().isEmpty() && position < string.length() && !verify) {
                    
                    //Esegui metodo step su singolo elemento
                    
                    treeSplit2(collectionSet, string);
                } else {
    
    
                    if (verifyIsMerge(singoleSet)) {
    
    
                        logger.error("combinazione ACCETTANTE trovata");
    
    
                            
                        INodo node = stepMerge(singoleSet);
                        if (node != null && automaton.getFinalStates().contains(node.getOriginState())) {
                            verify = true;
                             
                        }
                } 
                }  
            }
    }
    }
    quando imposto la variabile "verify" a true vorrei fermarmi con la ricorsione, � possibile fare ci�?
    Grazie

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da cerza Visualizza il messaggio
    quando imposto la variabile "verify" a true vorrei fermarmi con la ricorsione
    Se vuoi uscire proprio dal metodo, basta un return al posto di verify = true;
    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 L'avatar di cerza
    Registrato dal
    Oct 2009
    Messaggi
    310
    Mi serve comunque impostare la variabile a true perché globale, ma se metto return dopo il verify non esce dal metodo se non dopo che ha eseguito tutti i nodi non ancora esaminati.

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da cerza Visualizza il messaggio
    Mi serve comunque impostare la variabile a true perché globale, ma se metto return dopo il verify non esce dal metodo se non dopo che ha eseguito tutti i nodi non ancora esaminati.
    Ah beh, aspetta ... avevo capito male io. Se metti un return, l'unica cosa certa è che in quella invocazione di treeSplit2 in cui sei non fai altri cicli e quindi non scendi sicuramente più "sotto" ricorsivamente. Ma questo NON blocca di per sé invocazioni ricorsive fatte dai livelli più "alti".

    Usare una variabile "globale" ... uhm, non è molto bello, detto in generale .... Io ti suggerirei di sfruttare un valore di ritorno boolean, visto che ora come ora non restituisci nulla.
    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 L'avatar di cerza
    Registrato dal
    Oct 2009
    Messaggi
    310
    Grazie per la risposta!

    Quote Originariamente inviata da andbin Visualizza il messaggio
    Ah beh, aspetta ... avevo capito male io. Se metti un return, l'unica cosa certa è che in quella invocazione di treeSplit2 in cui sei non fai altri cicli e quindi non scendi sicuramente più "sotto" ricorsivamente. Ma questo NON blocca di per sé invocazioni ricorsive fatte dai livelli più "alti".
    Per cui le invocazioni ricorsive fatte dai livelli più alti non possono essere in alcun modo fermate, giusto?

    Usare una variabile "globale" ... uhm, non è molto bello, detto in generale .... Io ti suggerirei di sfruttare un valore di ritorno boolean, visto che ora come ora non restituisci nulla.
    Ma alla fine se mettessi una variabile locale e modificassi il tipo di ritorno del metodo non è la stessa cosa? quale la scelta migliore?
    Grazie ancora, aspetto un tuo consiglio.

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da cerza Visualizza il messaggio
    Per cui le invocazioni ricorsive fatte dai livelli più alti non possono essere in alcun modo fermate, giusto?
    Certo che si può, basta far ritornare dal livello più "basso" una indicazione (es. false = ferma tutto), che il metodo dovrà ovviamente testare e quindi potrà fare subito un return false, il livello ancora più alto vedrà false e ritornerà false, ecc...
    È così che si può (e si dovrebbe) ragionare.

    Adesso, quando invochi ricorsivamente treeSplit2(collectionSet, string) non testi nulla.

    Quote Originariamente inviata da cerza Visualizza il messaggio
    Ma alla fine se mettessi una variabile locale e modificassi il tipo di ritorno del metodo non è la stessa cosa? quale la scelta migliore?
    Non ho capito cosa c'entra una variabile locale .... ogni invocazione di un metodo ha il suo stack frame, le sue variabili locali.
    Non puoi far "comunicare" due invocazioni di metodi (anche se fosse lo stesso metodo) solo di per sé con una variabile locale ..... a meno che tenga il riferimento ad un oggetto "condiviso" che ha stato mutabile. Ma dimentica questo pezzetto ...
    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 L'avatar di cerza
    Registrato dal
    Oct 2009
    Messaggi
    310
    Grazie per la pazienza
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Adesso, quando invochi ricorsivamente treeSplit2(collectionSet, string) non testi nulla.
    Allora nel while ho messo il controllo sulla valore della variabile verify, non basta? devo dichiarare un'altra variabile oltre a quella booleana "verify"?


    Quote Originariamente inviata da andbin Visualizza il messaggio
    Non ho capito cosa c'entra una variabile locale .... ogni invocazione di un metodo ha il suo stack frame, le sue variabili locali.
    Non puoi far "comunicare" due invocazioni di metodi (anche se fosse lo stesso metodo) solo di per s� con una variabile locale ..... a meno che tenga il riferimento ad un oggetto "condiviso" che ha stato mutabile. Ma dimentica questo pezzetto ...
    Mi riferivo a quanto scritto nel post precedente in cui mi suggerivi che le variabili globali non erano proprio il top della programmazione

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