Ricorsione in C: eliminare i doppioni da una stringa di testo

Un esercizio un po’ insolito sulla ricorsione e array di caratteri da dove si vuole eliminare i caratteri adiacenti “doppioni”. Un esercizio apparentemente semplice ma che nasconde alcune insidie. L’argomento della ricorsione è molto battuto soprattutto nei percorsi accademici di informatica, meno nelle scuole superiori dove i programmi sono già abbastanza gravosi.

Vogliamo realizzare una funzione ricorsiva che “riduca” le coppie di lettere identiche ripetute all’interno di un vettore di caratteri.

Esempi:

f(aabbcd)=abcd

f(aaaabbbbcd)=f(aabbcd)=abcd

/***

Vogliamo realizzare una funzione ricorsiva che "riduca" le coppie di lettere
Esempi:
f(aabbcd)=abcd
f(aaaabbbbcd)=f(aabbcd)=abcd
*/

#include <iostream>
#include <string.h>
#define N 20

using namespace std;

void stampa (char _stringa[])
{
    int i;
    int lungh = strlen(_stringa);
    for (i=0; i < lungh; i++)
    {
        if (_stringa[i]!='\0')
            printf("%c", _stringa[i]);
    }
}


char * f(char _stringa[])
{
    int i,k;
    int spostato=0;
    int lungh = strlen(_stringa);

    for(i=0; i < N; i++)
    {
        //controllo due letetre adiacenti
        if (_stringa[i] == _stringa[i+1])
        {
            //devo reimpostare la stringa per eliminare la coppia
            //sposto tutto di una lettera verso sinistra
            for(k=i; k < lungh; k++)
            {
                _stringa[k]=_stringa[k+1];
                spostato++;
            }
        }
    }

    //stampa(_stringa);
    if (spostato)  //se ho spostato qualcosa, faccio un ulteriore passaggio di controllo
        return f(_stringa);

    return _stringa;
}



int main()
{
    char stringa[20]=" ";
    stampa(stringa);
    char *s;

    printf("Inserisci la stringa da verificare: ");
    scanf("%s", stringa);

    s = f(stringa);
    stampa(s);

    return 0;
}

Ultima modifica 6 Settembre 2023