PDA

Visualizza versione completa : Ricorsione in C


NS-1
14-07-2004, 11.21.43
potete dare un occhio a questo esempio?


#include <stdio.h>

main(){
char stringa[80];
void inverti(char *);

printf("\nInserisci una stringa:\n");
fgets(stringa, 80, stdin);

printf("\nInvertita:");
inverti(stringa);

printf("\n\n");

return 0;
}

void inverti(char *frase){
if(frase[0] == '\0')
return;
else{
inverti(&frase[1]);
putchar(frase[0]);
}

}


non lo capisco proprio!!! :crying:
capisco la ricorsione ma non PERCHE' FUNZIONA!
:wall:

NS-1
14-07-2004, 11.38.07
pensandoci potrebbe essere così:

finché non trovo '\0' scorro tutto l'array con la ricorsione lasciando in sospeso le funzioni putchar() che arrivati alla fine verrando eseguite dall'ultima alla prima...


è tanto diverso da come l'ho capita io? :D

Dav82
14-07-2004, 11.55.51
Originariamente inviato da NS-1
pensandoci potrebbe essere così:

finché non trovo '\0' scorro tutto l'array con la ricorsione lasciando in sospeso le funzioni putchar() che arrivati alla fine verrando eseguite dall'ultima alla prima...


è tanto diverso da come l'ho capita io? :D

No no, perfetto (Y)

Frase = abcd\0

tieni in sospeso la putchar("a") e chiami inverti(bcd)
tieni in sospeso la putchar("b") e chiami inverti(cd)
tieni in sospeso la putchar("c") e chiami inverti(d)
tieni in sospeso la putchar("d") e chiami inverti(\0)
termini
fai le putchar al contrario ;)

Dav82
14-07-2004, 11.57.00
Ah, tanto per dire: questo è un bell'esempietto scolastico... se stai imparando a programmare beh, sono cose necessarie da capire, ma in un programma un minimo serio non ti sognare mai di fare in questo modo per invertire una stringa :D E' un suicidio! :D :D :D

P8257 WebMaster
14-07-2004, 12.03.57
(Y) .. C'é la legge del taglione :D...

come col GOTO... :D

Bye :cool:

NS-1
14-07-2004, 12.12.21
.. :D .. preferisco la programmazione strutturata alla ricorsiva .. senza contare che con programmi un pochinò più corposi i pc cominciano a sudare e paingere con la ricorsione...

quello era solo un esempio che ho trovato su un libro...
...come idea mi ha stupito, per il resto... :rolleyes:

:D :D :D :D :D

p.s. Dav, bella la sign :D

NS-1
16-07-2004, 18.52.47
WEB, dopo le prime smanettate ho notato subito un certo odio alle funzioni come GOTO...
..quindi, da ipocrita, credendomi programmatore, non l'ho più utilizzata... forse una volta per fare in fretta... :D

ma qual'è il motivo vero?
oltre alla poca leggibilità del codice e alle difficili implementazioni successive che altri problemi può dare?

comunque: GOTO (N)

P8257 WebMaster
17-07-2004, 14.13.27
NS-1 ha scritto:
...oltre alla poca leggibilità del codice e alle difficili implementazioni successive che altri problemi può dare?

comunque: GOTO (N)

... E dici poco ... :eek:...

Il GOTO non va usato (pena, taglio delle mani) nella programmazione perché genera errori di coerenza e di contiguità del flusso .. che diventa appunto discontinuo a causa dei salti che questa istruzione produce ...

Inoltre si avranno pezzi di codice sparsi per il programma e in più un singolo "goto" ne genera altri .. poiché si creeranno situazioni dalle quali tu ti devi "divincolare" da questi pezzi di codice il programma diventa un goto tira l'altro generando errori ricorsivi sempre più grandi, limitandone fortemente la leggibilità e impedendone quasi il debug in situazioni estreme....

Faccio un esempio in pseudocodice:


:blocco A
- ... istruzioni blocco A
- se arrivo qui dal blocco B non devo rifarlo ma goto blocco C
- controllo il flag del blocco C per vedere se è già stato chiamato da me

:blocco B
- .. istruzioni blocco b
- Se succede qualcosa: goto blocco A

:blocco C
- istruzioni blocco C
- se sono arrivato dal blocco B allora goto blocco A
- se sono arrivato dal blocco A allora goto blocco D
e setto il flag per far capire al blocco A di non chiamarmi più...

:Blocco D
Riposa in pace....



Ti assicuro che nelle varie ricorsioni non ho esagerato .. ho visto di mooolto mooolto peggio .. :D

GOTO ... die! :D


Bye :cool:

NS-1
17-07-2004, 14.45.23
(Y) :D