Ricorsione Stringa

di il
4 risposte

Ricorsione Stringa

Salve, sto svolgendo questo esecizio:

Scrivere un metodo ricorsivo public String cifra(String s, char a, char b), che restituisce una nuova stringa ottenuta da s in cui ogni occorrenza del carattere a è sostituita con un'occorrenza di b.
Esempio: cifra("caparezza", 'a', 'i') deve restituire "cipirezzi".


Codice:
static public String cifra(String s, char a, char b)
{
        int i = 0;
        String ris = "";
        cifraRic(s, a, b, ris, i);
        return ris;
}

private static void cifraRic(String s, char a, char b, String nuova, int i) 
{
        if(i == s.length()-1)
        {
            if(s.charAt(i) == a)
                nuova += b;
            else
                nuova += s.charAt(i); 
             
            return;
        }
        if(s.charAt(i) == a)
            nuova += b;
        else
            nuova += s.charAt(i);
        
        cifraRic(s, a, b, nuova, ++i);

}

Nel main faccio questo:
public static void main(String[] args) 
{
        String s = "caparezza";
        String ris = cifra(s, 'a', 'i');
  
        System.out.println(ris);

}
Non mi stampa niente. Come mai?

Un'altra cosa:

quello che ho fatto io alla fine non è ciò che viene richiesto nel testo.
Perché questo mi dice che cifra debba essere ricorsivo, mentre non lo è. Si limita semplicemente a chiamare cifraRic che, invece, è ricorsivo.

Ho fatto così perché altrimenti non saprei come gestire l'inizializzazione dell'indice e della stringa su cui lavoro.

Cioè se facessi una cosa del tipo:
static public String cifra(String s, char a, char b)
{
        int i = 0;
        String nuova = "";
        if(i == s.length()-1)
        {
            if(s.charAt(i) == a)
                nuova += b;
            else
                nuova += s.charAt(i); 
             
            return nuova;
        }
        if(s.charAt(i) == a)
            nuova += b;
        else
            nuova += s.charAt(i);
        
        i++;
        cifra(s, a, b);

}   
Non andrebbe bene, perché ogni volta che la funzione richiamasse se stessa, i tornerebbe a 0 e nuova = "".

Come potrei fare?

Grazie

4 Risposte

  • Re: Ricorsione Stringa

    Devi per prima cosa definire il concetto di stringa in modo ricorsivo, ad esempio (che poi tanto esempio non e' ):


    1) una stringa e' una sequenza di 0 caratteri,
    2) oppure un carattere sequito da una sequenza di caratteri


    a partire da questa definizione, prova a implementare in modo ricorsivo la funzione clonaStringa(s), in cui tu passi una stringa e lei ti ritorna la stessa stringa, ma clonata (cioe' una nuova stringa costruita carattere per carattere a partire dalla stringa passata come argomento.

    Se vuoi fare ancora un passetto prima, implementa in modo ricorsivo la funzione lunghezzaStringa(s), che ti ritorna la lunghezza della stringa.

    Quindi implementi clonaStringa(s).

    Dopo di che puoi implementare la funzione cifraStringa(s, a, b), perche' avrai capito esattamente come funziona la ricorsione.

    Scommettiamo che prima scrivevi in C???

    Non ti ritorna nulla perche' in Java la stringa e' un oggetto immutabile

    E tu ti chiederai: e che vuol dire????

    La risposta e' banale: STUDIA!!!!!!
  • Re: Ricorsione Stringa

    migliorabile ha scritto:


    Scommettiamo che prima scrivevi in C???
    Sì, e ci scrivo tutt'ora. In C non è difficile in questo caso, dato che posso utilizzare l'aritmetica dei puntatori come indice.

    migliorabile ha scritto:


    Non ti ritorna nulla perche' in Java la stringa e' un oggetto immutabile
    Questo particolare mi era sfuggito, grazie.
  • Re: Ricorsione Stringa

    Un'altra cosa:

    quello che ho fatto io alla fine non è ciò che viene richiesto nel testo.
    Perché questo mi dice che cifra debba essere ricorsivo, mentre non lo è. Si limita semplicemente a chiamare cifraRic che, invece, è ricorsivo
    È una prassi del tutto lecita. Vengono chiamati metodi wrapper/helper.
    Il metodo wrapper (non ricorsivo) è quello che si occupa di fare eventuali null check o altri controlli e di inizializzare eventuali parametri da passare al metodo helper; in genere è pubblico.
    Il metodo helper è il metodo ricorsivo vero e proprio che può avere più parametri del wrapper e di norma è privato.
  • Re: Ricorsione Stringa

    Aleph Zero ha scritto:



    È una prassi del tutto lecita. Vengono chiamati metodi wrapper/helper.
    Il metodo wrapper (non ricorsivo) è quello che si occupa di fare eventuali null check o altri controlli e di inizializzare eventuali parametri da passare al metodo helper; in genere è pubblico.
    Il metodo helper è il metodo ricorsivo vero e proprio che può avere più parametri del wrapper e di norma è privato.
    Perfetto, grazie.
Devi accedere o registrarti per scrivere nel forum
4 risposte