Conta occorrenze di un carattere con ricorsione

Data una parola in input ed un carattere, contare quante volte quell’assegnato carattere si ripete nella parola scelta. Questo è un problema che, risolto con una semplice visita su un array, sarebbe anche apparentemente semplice. Vogliamo fare un passettino in avanti e vogliamo individuare la soluzione utilizzando la ricorsione.

La strategia ricorsiva

Individuare gli elementi per produrre una ricorsione non sono mai banali a meno di avere una larga esperienza su questo genere di soluzioni. La strategia ricorsiva spesso è affrontata sui banchi delle università mentre nelle scuole superiori viene solo accennata su problemi notevoli.

L’idea di base è che abbiamo una funziona che controlla una porzione dei dati a disposizione e richiama se stessa sulla successiva porzione dei dati. Qui abbiamo un vettore, quindi formalmente abbiamo bisogno che la funzione controlli se in una singola posizione, a cominciare dalla zero, è presente o meno i carattere conteggiandolo, per poi spostarsi nella posizione successiva del vettore e quindi procedo a richiamare la funzione stessa sulla posizione del vettore successiva. La funzione torna sempre una somma parziale che va di iterazione in iterazione accumulata in una variabile, anche globale eventualmente.

Il codice

#include <stdio.h>
const int LUNGHEZZA = 100;


int occorrenzeRicorsiva(char parola[], char carattere, int indice)
{
  
  int occorrenze =0;
  
  if (parola[indice] == carattere)
  {
    occorrenze++;
  }  
  indice++;
  if (indice < LUNGHEZZA)
    occorrenze += occorrenzeRicorsiva(parola, carattere, indice);
  
  return occorrenze;
}

int main(void) 
{
  char parola[LUNGHEZZA];
  char carattere;

  printf("Inserisci una parola da analizzare ");
  fgets(parola,LUNGHEZZA, stdin);   

  printf("Inserisci un carattere da conteggiare ");
  scanf("%c", &carattere);
  printf("Il carattere a si ripete %d volte \n",occorrenzeRicorsiva(parola, carattere, 0));


  printf("Premi un tasto per uscire");
  getchar();
  return 0;
}

Ultima modifica 27 Novembre 2022