Ricorsione stringa

di il
8 risposte

Ricorsione stringa

Ciao,
ho iniziato a studiare le ricorsioni e ho qualche difficoltà con un esercizio che richiede un metodo ricorsivo per raddoppiare tutti i caratteri di una stringa.
Ad es.: inserendo la stringa "cane", deve restituire "ccaannee".

Sono arrivata a questo punto e proprio non capisco qual è il ragionamento corretto per ottenere ciò che mi serve:

public static String duplica (String a){
String stringa="";
int i=0;
if (a.length()==1){
stringa+=stringa;
}
else
stringa=duplica(a.substring(i, a.length()-1));

return stringa;
}

In questo modo, ovviamente, arrivo ad avere solo il primo carattere della stringa raddoppiato.
La mia idea per il passo ricorsivo era di applicare il metodo alla sottostringa successiva(da indice 1 a a.length()-1) ... ma probabilmente sto ragionando nel modo sbagliato.

Grazie per il Vs aiuto.

8 Risposte

  • Re: Ricorsione stringa

    MariJ ha scritto:


    ho iniziato a studiare le ricorsioni e ho qualche difficoltà con un esercizio che richiede un metodo ricorsivo per raddoppiare tutti i caratteri di una stringa.
    Ad es.: inserendo la stringa "cane", deve restituire "ccaannee".
    Sei un po' (tanto) fuori strada. Vediamo se riesco a farti "intuire" cosa fare.

    Innanzitutto il metodo deve comportarsi allo stesso modo nei vari livelli di ricorsione .... fino ad un certo punto per cui una condizione è tale che non devi più andare in ricorsione.
    Quindi in questi casi devi sempre cercare di decomporre la questione in modo che la stessa logica sia applicabile a più livelli di ricorsione.

    Ecco l'indizio: il metodo riceve una stringa es. "cane".

    - spezzi tra il primo e secondo carattere "c" e "ane"
    - il primo carattere lo raddoppi --> "cc"

    Prova a pensare: cosa ne fai di "ane" ??

    P.S. io ho provato a scriverlo ora: tutto il metodo compreso (dalla dichiarazione fino alla } finale) sono 8 righe di codice, con 1 if e 2 substring .
  • Re: Ricorsione stringa

    Ti ringrazio molto dei suggerimenti.
    Ho trasformato in questo modo e pare funzionare, ma il passo base mi lascia decisamente perplessa ...

    public static void duplica (String a){

    if (a.length()==1)
    System.out.print("");

    else
    duplica(a.substring(0, a.length()-1));
    a=a.substring(a.length()-1);
    System.out.print(a+a);
    }

    Grazie ancora.
  • Re: Ricorsione stringa

    MariJ ha scritto:


    Ho trasformato in questo modo e pare funzionare, ma il passo base mi lascia decisamente perplessa ...
    No, non ci siamo ...

    Innanzitutto hai cambiato forma del metodo. Prima era:

    public static String duplica (String a)

    Se metti void, puoi ancora applicare certamente la ricorsione ma la "esercitazione" sulla ricorsione viene molto meno e diventa poco interessante. Quindi mantieni com'era prima.

    Partiamo da un presupposto: cosa dovrebbe restituire il metodo se viene passato null oppure stringa vuota ("")?? Te lo dico io semplicemente: può benissimo restituire il parametro tale e quale. Questo è utile, in generale.

    Altrimenti (se non null e non "") allora .... qui entra in gioco il discorso della ricorsione.
    Ti ripeto che l'obiettivo è di separare il primo carattere dal resto. Ti garantisco che bastano 2 substring e che non c'è bisogno del length() nei substring!

    Prova a pensarci.
  • Re: Ricorsione stringa

    Vediamo se ho capito cosa intendi ....

    public static String duplica (String a){

    if (a.length()==0)
    return a;

    else
    a+=duplica(a.substring(0,0));
    a=a.substring(1);

    return a;
    }


    Grazie, gentilissimo!
  • Re: Ricorsione stringa

    MariJ ha scritto:


    Vediamo se ho capito cosa intendi ....
    Ehm .. no, proprio per niente!
    Vediamo se riesco a farti capire bene l'approccio.

    Tu invochi direttamente duplica passando "cane". Questa è la prima invocazione "diretta" (non ricorsiva). L'obiettivo di questa invocazione è di ottenere ovviamente "ccaannee" come risultato finale complessivo.

    Visto che non è null/vuota, spezzi la stringa ed ottieni "c" e "ane". Duplichi la prima lettera, ottieni "cc". Quindi invochi ricorsivamente duplica passando ... "ane". E questo perché l'obiettivo è ottenere a questo livello un risultato parziale di "aannee".

    La invocazione con "ane", si porrà le stesse questioni. Spezza ed ottiene "a" (che raddoppierà in "aa") e "ne", ecc...

    Riesci a "vedere" la stessa logica che si ripete nei vari livelli di invocazione? Ho "acceso" una luce in più?


    P.S. ricorda che in substring(int beginIndex, int endIndex) il beginIndex è l'indice di inizio incluso mentre endIndex è l'indice di fine escluso.
  • Re: Ricorsione stringa

    Probabilmente nemmeno questo corrisponde a ciò che intendi....

    public static String duplica (String a){

    String stringa;

    if (a.length()==0)
    return stringa=a;

    else
    stringa=(a.substring(0,1)) + (a.substring(0,1));
    stringa+=duplica(a.substring(1));

    return stringa;
    }

    Nel caso ...con molta frustrazione,mi arrendo ...
    Grazie
  • Re: Ricorsione stringa

    Sì! Tecnicamente è corretto. Ma si può migliorare e ridurre, ci sono cose inutili.

    (ma l'hai provato??)
  • Re: Ricorsione stringa

    Lo immagino... prometto che proverò a "pulirlo"!
    Ma mi è stato molto utile lo sforzo di ragionare sul meccanismo, grazie!
    Comunque sì, li ho provati tutti prima di sottoporteli.
Devi accedere o registrarti per scrivere nel forum
8 risposte