PDA

View Full Version : Programmino ricorsivo in C


matty.ma
14-02-2006, 08:57
Salve a tutti avrei bisogno di un aiutino :

Scrivere una funzione ricorsiva che ha come parametro di ingresso una stringa e restituisce in uscita il numero delle lettere minuscole presenti in essa

Qualcuno mi potrebbe scrivere il codice in C ??
Se non fosse ricorsivo era naturalmene più facile, essendo ricorsivo faccio fatica...

Ziosilvio
14-02-2006, 10:29
Suggerimento: il numero di lettere minuscole di una stringa è pari al numero di lettere minuscole dopo il suo primo carattere, più 1 se e solo se il primo carattere è una lettera minuscola.

wisher
14-02-2006, 10:29
passa il puntatore a char:
se è il terminatore ritorna 0
altrimenti
se maiuscola ritorna 0+la chiamata della funzione con punatore al prox elem
se minuscola ritorna 1+la chiamata della funzione con punatore al prox elem

matty.ma
14-02-2006, 11:02
Quello che ho capito è che devo controllare carattere per carattere , quindi mi basta controllare il primo , verificare se è minuscolo con un IF

if ( c >= 'a' && c <= 'z' )
n++;

*/ Dove n è la mia variabile che contiene il numero di caratteri minuscoli /*

e poi richiamare di nuovo la funzione, però il mio problema è quello di non sapere come richiamare la funzione per poter controllare il secondo carattere

la funzione va definita così ?

int nome_funzione (argomenti)

Ma per argomenti devo mettere solo quelli in ingresso ovvero CHAR

wisher
14-02-2006, 11:09
allora prova con

int contaminuscole(char* stringa){
if((*stringa)=='\0')
return 0;
else{
if((*stringa)>='a'&&(*stringa)<='z'){
stringa++;
return 1+contaminuscole(stringa);
}
else {
stringa++;
return 0+contaminuscole(stringa);
}
}
}

fammi sapere se funziona (spero di si) e se nn hai capito qualcosa

dnarod
14-02-2006, 11:35
non apro un 3d nuovo, ma ho un problema ricorsivo su lista pure io (java ma è uguale). in effetti è straordinariamente semplice, ma ho un blocco mentale: ho una lista puntata (singolarmente) e devo mettere, in un campo specifico, in ogni elemento la somma dei successivi (che contengono un altro dato int); quindi zero nell ultimo elemento e, a mano a mano, la somma dell ultimo e penultimo, ultimo penultimo terzultimo, eccetera fino al primo...

me lo sono levato dalle balle iterativamente, ma lo trovo brutalmente orribile e nooby come metodo, mi vergogno quasi di chiedere...

wisher
14-02-2006, 11:46
non apro un 3d nuovo, ma ho un problema ricorsivo su lista pure io (java ma è uguale). in effetti è straordinariamente semplice, ma ho un blocco mentale: ho una lista puntata (singolarmente) e devo mettere, in un campo specifico, in ogni elemento la somma dei successivi (che contengono un altro dato int); quindi zero nell ultimo elemento e, a mano a mano, la somma dell ultimo e penultimo, ultimo penultimo terzultimo, eccetera fino al primo...

me lo sono levato dalle balle iterativamente, ma lo trovo brutalmente orribile e nooby come metodo, mi vergogno quasi di chiedere...
che ne dici di questo?
nn l'ho testato ma mi pare andare

void dnarod(nodo* lista){
//ultimo
if(lista->next==NULL){
lista->valore=0;
return;
}
//penultimo
if(lista->next->next==NULL){
nodo->valore=lista->next->valore;;
return dnarod(lista->next);}
//generico
else{
lista->valore=(lista->next->valore+lista->next->next->valore);
return dnarod(lista->next);
}
}

dnarod
14-02-2006, 12:28
grazie, ma quello mette in un elemento la somma dei due successivi...il primo elemento deve avere la somma di tutti i successivi, e cosi via, il secondo, la somma di tutti i successivi al secondo eccetera...pero forse ci sono arrivato grazie!!

dnarod
14-02-2006, 12:52
ho capito adesso che volevi dire...il fatto è che gli elementi hanno 2 campi, uno col valore intero e l altro nel quale devo mettere le informazioni...non devo cambiare i valori degli elementi, devo mettere le informazioni volute nell altro campo non mutando i valori, altrimenti cio che mi hai consigliato tu sarebbe stato giusto...

matty.ma
14-02-2006, 13:38
X quanto riguarda me vi ringrazio della risposta e del codice che mi serve per capire come funizona una funzione ricorsiva

wisher
14-02-2006, 13:38
ho capito adesso che volevi dire...il fatto è che gli elementi hanno 2 campi, uno col valore intero e l altro nel quale devo mettere le informazioni...non devo cambiare i valori degli elementi, devo mettere le informazioni volute nell altro campo non mutando i valori, altrimenti cio che mi hai consigliato tu sarebbe stato giusto...
se vuoi la somma di tutti i valori precedenti devi mettere la chiamata ricorsiva prima della somma, e poi lascia return senza niente

andbin
14-02-2006, 13:55
Questa è la più compatta che mi è venuta in mente:
int conta_minuscole (char *s)
{
if (*s)
return (*s >= 'a' && *s <= 'z' ? 1 : 0) + conta_minuscole (++s);
else
return 0;
}

Comunque bisogna ammettere che usare una funzione ricorsiva per fare 'sta cosa è molto ROTFL. ;)

Qu@ker
14-02-2006, 14:20
non apro un 3d nuovo, ma ho un problema ricorsivo su lista pure io (java ma è uguale). in effetti è straordinariamente semplice, ma ho un blocco mentale: ho una lista puntata (singolarmente) e devo mettere, in un campo specifico, in ogni elemento la somma dei successivi (che contengono un altro dato int); quindi zero nell ultimo elemento e, a mano a mano, la somma dell ultimo e penultimo, ultimo penultimo terzultimo, eccetera fino al primo...


Non so se ho capito:

int somma_successivi(lista *l)
{
if (! l->next)
l->somma = 0;
else
l->somma = somma_successivi(l->next);

return (l->somma + l->valore);
}

Qu@ker
14-02-2006, 14:28
Questa è la più compatta che mi è venuta in mente:


int minuscole(char *s)
{
return (islower(*s) != 0) + ((*s) ? minuscole(s+1) : 0);
}

dnarod
14-02-2006, 14:43
grazie, ho acceso il cervello e ho risolto...mi vergogno di me stesso :)

matty.ma
14-02-2006, 15:20
Mi sto preparando per un compito, ma se per caso devoi Scrivere una funzione ricorsiva che ha come parametro di ingresso un numero naturale e restituisce in uscita il numero delle sue cifre uguali a 0 o 5.

Se si tratta di numeri e non di stringhe come devo comportarmi ??

wisher
14-02-2006, 15:26
Mi sto preparando per un compito, ma se per caso devoi Scrivere una funzione ricorsiva che ha come parametro di ingresso un numero naturale e restituisce in uscita il numero delle sue cifre uguali a 0 o 5.

Se si tratta di numeri e non di stringhe come devo comportarmi ??
il discorso è + o - lo stesso, puoi trasformare l'intero in stringa con itoa(intero) oppure utilizzi la divisione per 10 e il resto per avere la cifra che devi elaborare