PDA

Visualizza la versione completa : [C] - Visualizzare una stringa al contrario usando la Ricorsione


bard0x
25-01-2013, 18:47
Ciao ragazzi, sto cercando di imparare questa dannata ricorsione e ho trovato quest'esercizio che mi sta dando un pò di problemi:
Scrivere una funzione ricorsiva che riceva come argomento un vettore di caratteri,e lo visualizzi al contrario !
Suggerimenti?

oregon
25-01-2013, 18:59
Cosa hai scritto?

Scara95
25-01-2013, 19:07
void printReverse(int length, char *string) {
if(length==0)
return;
printf("%c", string[length-1]);
printReverse(length-1, string);
}

//printReverse(strlen(string), string);

bard0x
25-01-2013, 19:28
Originariamente inviato da Scara95

void printReverse(int length, char *string) {
if(length==0)
return;
printf("%c", string[length-1]);
printReverse(length-1, string);
}

//printReverse(strlen(string), string);

Sei un grande c***o, come al solito non ti smentisci mai ! Sai dove posso trovare qualche dispensa fatta bene sulla ricorsione? E' da pochissimo che la sto studiando e ho molti problemi... Cioè ad esempio ho appena testato il codice e naturalmente funziona alla grande però non mi spiego questo:

Per esempio prendiamo in considerazione la parola "ciao";

Se la lunghezza è == 0 restituisci NULL altrimenti stampa il vettore[lenght-1] vale a dire in questo caso sposta il carattere "o" di ciao in prima posizione.
Ora con printReverse(length-1, string) suppongo a questo punto che la lunghezza del vettore andrà a dimunire a -2 , -3 fino a -4 restituendo così la parola inversa... Non riesco a capire questo passaggio in quanto cmq è come se ci fosse un ciclo ,anche se non è presente...

Scara95
25-01-2013, 19:36
Se vuoi capire bene la ricorsione ti consiglio di staccarti dal linguaggio C, potresti leggere The Little Schemer...
È una spiegazione molto completa della ricorsione che nel contempo introduce scheme, tuttavia scheme non viene introdotto come linguaggio, ma come veicolo per la spiegazione della ricorsione...

Per quanto riguarda il codice, length all'inizio è la lunghezza della stringa, e non zero!

goatboy
25-01-2013, 19:38
Semplicemente richiami iterativamente la funzione PrintReverse, passando ogni volta un carattere in meno. Una volta che la lunghezza della stringa sarà ridotta a 0, uscirai dalla funzione e la stampa sarà finita.
Prova a fare la stessa cosa per la stampa "normale" di una stringa, magari ti sarà più chiaro.

MItaly
26-01-2013, 00:32
Giusto per vedere un'implementazione alternativa:


void reverseprint(const char * str)
{
if(*str)
{
reverseprint(str+1);
putchar(*str);
}
}

bard0x
26-01-2013, 01:29
Scara95 lo comprerò sicuramente ! Grazie ancora e grazie a tutti per le altre risposte ,siete stati gentilissimi e completi !

Scara95
26-01-2013, 07:14
Originariamente inviato da MItaly
Giusto per vedere un'implementazione alternativa:


void reverseprint(const char * str)
{
if(*str)
{
reverseprint(str+1);
putchar(*str);
}
}
Sì, hai ragione, infatti era la prima implementazione che avevo pensato, ma ormai, al di fuori di Haskell, escludo automaticamente ciò che non è tail recursive ^^'

Prego, non c'è di che, intanto comunque assicurati di capire questi spezzoni di codice!

MItaly
26-01-2013, 14:27
Originariamente inviato da Scara95
Sì, hai ragione, infatti era la prima implementazione che avevo pensato, ma ormai, al di fuori di Haskell, escludo automaticamente ciò che non è tail recursive ^^'
E in effetti ha senso farlo anche in C, dato che praticamente ogni compilatore implementa l'ottimizzazione per la tail recursion (evitando di creare stack frame ulteriori). :mem:

Loading