Versione ricorsiva

di il
15 risposte

Versione ricorsiva

Ho creato un metodo iterativo che data una stringa s ed un intero n verifica se la stringa s è presente in una lista almeno n volte...
Il metodo iterativo credo vada bene.Ho problemi sul metodo ricorsivo che non funziona come dovrebbe...Qualcuno potrebbe aiutarmi pls?

vi lascio le classi create qua sotto..



package lista2020;


public class Elemento {
    String n;
    Elemento successivo;
    
    public Elemento(String n, Elemento successivo){
        this.n=n;
        this.successivo=successivo;
    }
}

package lista2020;


public class Lista2020{

  
    public static void main(String[] args) {
     Lista l=new Lista(30);
     System.out.println(l.verifica("stringa10", 1));
     System.out.println(l.verificaR("stringa20", 2));

    }
    
}


package lista2020;

public class Lista {
    Elemento testa=null;
    int contatore=0;
    
    public Lista(int n){
         for(int i=n;i>=1;i--){
         testa=new Elemento("Stringa"+i,testa);
          }
       }

    
    
 public boolean verifica(String s, int n) {
        Elemento e = testa;
        int c = 0;

        while (e != null && c < n) {
            if (e.n.equals(s)) {
                c++;
            }
            e = e.successivo;
        }
        if (c == n) {
            return true;
        } else {
            return false;
        }
    }

/*
    /**
     *
     * @param n
     * @param s
     * @return
     */

    public boolean verificaR( String s,int n){
return verificaR(testa,n,s);
}

private boolean verificaR(Elemento e,int n ,String s){

    if(n==0||contatore==n){
        return true;
    }
   
    else  verificaR(testa.successivo,n,s);
     if(e.n.equals(s)){
         contatore++;
     }

return verificaR(testa.successivo,n,s);
}



}

15 Risposte

  • Re: Versione ricorsiva

    Yoshi999 ha scritto:


    Ho problemi sul metodo ricorsivo che non funziona come dovrebbe...Qualcuno potrebbe aiutarmi pls?
    La questione è che la tua versione "ricorsiva" NON dovrebbe usare quel contatore che è esterno al metodo. Il ragionamento andrebbe fatto diversamente.
    Ragiona un po' su quel n che passi ricorsivamente ...... devi sempre passare lo stesso valore? O magari .... no?
  • Re: Versione ricorsiva

    Ho provato a cambiare un pò il codice , può andar bene?
    
    private boolean verificaR(Elemento e,int n ,String s){
    
    
        if(n==0){
            return true;
        }
       
        else  
         if(e.n.equals(s)){
             verificaR(testa.successivo,n-1,s);
         }
    
    return false;
    }
  • Re: Versione ricorsiva

    Yoshi999 ha scritto:


    Ho provato a cambiare un pò il codice , può andar bene?
    No non ha proprio alcun senso. Ragiona meglio e più in generale.

    Nota: nel tuo codice hai fatto generare delle stringhe nella forma "Stringa"+i quindi tutte diverse. Ma immagina se avessi una catena fatta così:

    testa ---> "paperino" ---> "pippo" ---> "paperino" ---> "paperino" ---> "gastone" ---> null

    E devi dire se "paperino" compare almeno 2 volte.
  • Re: Versione ricorsiva

    La mia idea era scalare n ogni volta che la stringa s è presente nella lista. Se arrivo a n='0' significa che la stringa è presente almeno n volte...almeno era quello che volevo fare
  • Re: Versione ricorsiva

    Yoshi999 ha scritto:


    La mia idea era scalare n ogni volta che la stringa s è presente nella lista. Se arrivo a n='0' significa che la stringa è presente almeno n volte...almeno era quello che volevo fare
    No. Primo: metti nella lista qualcosa di più sensato (come nel mio esempio sopra) .... non stringhe tutte diverse, altrimenti il senso di "almeno n volte" non ha granché senso ...
    Secondo: quindi poi ragiona meglio.
  • Re: Versione ricorsiva

    Ho provato a farlo in questo modo ma non so se è corretto...
    private boolean verificaR(Elemento e,int n ,String s){
        int a=0;
    
    if(a==n){
        return true;
    }
    
    if (testa==null){
        return false;
    }
    
          if(e.n.equals(s)){
              a++;
          }
    
    return verificaR(e.successivo,n,s);
    
    }
  • Re: Versione ricorsiva

    Yoshi999 ha scritto:


    Ho provato a farlo in questo modo ma non so se è corretto...
    No, continua a non avere alcun senso (tra l'altro incrementi una variabile locale che poi "sparisce"! e il confronto testa==null non ha senso).
  • Re: Versione ricorsiva

    Potresti mostrarmi per favore come dovrei fare?
  • Re: Versione ricorsiva

    Yoshi999 ha scritto:


    Potresti mostrarmi per favore come dovrei fare?
    Assicuro che è proprio solo questione di "ragionamento"!
    Hai creato la lista con dati più sensati (e che si ripetono)?

    E ci sarebbe da stabilire cosa fare se viene chiesto "almeno 0 volte". Potrebbe valere sempre true in senso generale oppure lo si può trattare come sempre false.
  • Re: Versione ricorsiva

    Si ho ricreato la lista ma non riesco a scrivere la ricorsione.....
  • Re: Versione ricorsiva

    Yoshi999 ha scritto:


    Si ho ricreato la lista ma non riesco a scrivere la ricorsione.....
    Nell'ordine seguente:

    Se il parametro n è 0, cosa fai? (qui scegliamo il senso semplice, che dia true)
    Se il parametro e è null, cosa fai? (è abbastanza logico ...)
    Se trovi la stringa nell'elemento, cosa fai con n?
    Fai la chiamata ricorsiva per andare sul "prossimo" elemento
  • Re: Versione ricorsiva

    Così va bene?
    
    private boolean verificaR(Elemento e,int n ,String s){
      
        if(n==0){
            return true;
        }
       if(e.n==null){
           return false;
       }
       
        if(e.n.equals(s)){
              verificaR(e.successivo,n-1,s);
          }
       
        return verificaR(e.successivo,n,s);
            
    }
  • Re: Versione ricorsiva

    Yoshi999 ha scritto:


    Così va bene?
    No perché se trovi s fai 2 invocazioni ricorsive. Ne basta una sola al fondo!! E se trovi s, basta scalare n.
  • Re: Versione ricorsiva

    Spero sia giusta ahah
    
    private boolean verificaR(Elemento e,int n ,String s){
    
        if(n==0){
            return true;
        }
       if(e.n==null){
           return false;
       }
       
       
        if(e.n.equals(s)){
              n--;
          } 
        return verificaR(e.successivo,n,s);
    
    }
Devi accedere o registrarti per scrivere nel forum
15 risposte