Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Funzione ricorsiva
Forum - C/C++ - Funzione ricorsiva - Pagina 2

Pagine: [ 1 2 3 ] Precedente | Prossimo
Avatar
Poggi Marco (Member)
Guru


Messaggi: 969
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 15:15
Domenica, 06/06/2010
Testo quotato

Postato originariamente da gforce:

Testo quotato

Postato originariamente da carlduke:

xd....giusto...nnn avevo visto..Lol :rotfl::rotfl:


la sai fare ricorsiva ?  



Credo basta fare così:
Codice sorgente - presumibilmente C++

  1. #include  <stdio.h>
  2.  
  3. int roll(int);
  4.  
  5. int main(int argc, char *argv[])
  6. {
  7.     int x = 2;
  8.     printf("%d\n%d\n", x,roll(x));
  9.     getchar();
  10.     return 0;
  11. }
  12.  
  13. int roll(int y)
  14. {
  15.     if (y==0)
  16.     {
  17.         return 0;
  18.     }
  19.     else
  20.     {
  21.        printf("%d\n", y);
  22.        return roll(--y);
  23.     }
  24. }


Ultima modifica effettuata da Poggi Marco il 06/06/2010 alle 15:16
PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1792
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 15:29
Domenica, 06/06/2010
l'unica soluzione corretta è quella di Poggi Marco :-)

Ragazzi, se non sapete che vuol dire "funzione ricorsiva" non postate ciaffate, altrimenti fate solo confondere le idee a chi cerca chiarimenti!

@gforce: in generale una funzione ricorsiva, per funzionare correttamente, deve essere strutturata in 2 parti: caso base e passo ricorsivo.

Il caso base è quello in cui la funzione restituisce un valore ben definito. Il passo ricorsivo è quello in cui il valore è determinato da una seconda chiamata alla stessa funzione.

come ti ha mostrato Poggi Marco, in questo caso il caso base è dato da y == 0, mentre il passo ricorsivo è dato da y > 0 e la ricorsione è costruita in modo tale da decrementare progressivamente la y fino a raggiungere il caso base (che termina la catena di ricorsioni).

PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2765
Iscritto: 21/09/2007

Segnala al moderatore
Postato alle 19:10
Domenica, 06/06/2010
Testo quotato

Postato originariamente da TheKaneB:

[PAROLE SENSATE]




meno male che ho contato fino a 10 e ho aspettato un reply intelligente... non sai cosa stavo per scrivere... :)

PM Quote
Avatar
gforce (Normal User)
Rookie


Messaggi: 33
Iscritto: 21/01/2010

Segnala al moderatore
Postato alle 21:53
Domenica, 06/06/2010
grazie a tutti... grazie a voi ho capito le funzioni ricorsive. Mi sorge solo un dubbio. Io sapevo che con l'istruzione
Codice sorgente - presumibilmente Plain Text

  1. return;

si uscisse dalla funzione ... ma in questo caso non l'ho fa ! commento il code sui i miei punti bui:

Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2.  
  3. int roll (int);
  4.  
  5. int main (void) {
  6.         int x = 2;
  7.         roll(x); // invoca la funzione
  8.         return 0; // esce dal programma
  9. }
  10.  
  11. int roll (int y) {
  12.         if (y == 0) { //controllo se è uguale a zero, se lo è stampa 0
  13.                 printf("%d\n", y);
  14.         } else {
  15.                 printf ("%d\n", y); // stampa il vero valore di y (che poi sarebbe x)
  16.                 return roll (y-1); // calcola y - 1 (ris. 1) e secondo me dovrebbe uscire  dalla funzione perchè incontra un return ... ma ciò non lo fa !
  17.         }
  18. }



A questa mia risposta mi sono dato una spiegazione, ma non so se è giusta. Potrei paragonare un ricorsione al while ... però la ricorsione si ripete fin quando si avvera una cosa (il contrario del while) Ripeto, non so se è giusto come paragone.

PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 969
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 22:28
Domenica, 06/06/2010
La ricorsione non funziona come un ciclo while.
Il comando return termina bruscamente la funzione in corso, però , in questo caso viene effettuata una nuova chiamata alla funzione roll.

Per capire meglio il meccanismo, prova a fare il debug del programma.

PM Quote
Avatar
gforce (Normal User)
Rookie


Messaggi: 33
Iscritto: 21/01/2010

Segnala al moderatore
Postato alle 8:25
Lunedì, 07/06/2010
Testo quotato

Postato originariamente da Poggi Marco:

La ricorsione non funziona come un ciclo while.
Il comando return termina bruscamente la funzione in corso, però , in questo caso viene effettuata una nuova chiamata alla funzione roll.

Per capire meglio il meccanismo, prova a fare il debug del programma.



Grazie a tutti, in particolare: Marco e TheKaneB :asd:

PM Quote
Avatar
gforce (Normal User)
Rookie


Messaggi: 33
Iscritto: 21/01/2010

Segnala al moderatore
Postato alle 20:05
Lunedì, 07/06/2010
modificando un po il source:
Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2.  
  3. int roll (int);
  4.  
  5. int main (void) {
  6.         int x = 2;
  7.         printf("%d\n", x);
  8.         roll(x);
  9.         printf("%d\n", x);
  10.         getchar();
  11.         return 0;
  12. }
  13.  
  14. int roll (int y) {
  15.         if (y == 0) {
  16.                 return 0;
  17.         }
  18.         return roll (y-1);
  19. }



adesso mi sorge una sola domanda (l'ultima :) ) !

Alla prima chiamata della printf mi stampa 2, invoco la funzione roll e quando uscirà dalla funzione roll, y (che poi sarebbe x) sarà uguale a 0 per tanto  alla seconda chiamata della funzione printf dovrà stamparmi 0 ma non è così perchè mi stampa sempre 2.

PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1792
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 21:09
Lunedì, 07/06/2010
ti stampa sempre 2 perchè ogni volta che passi un parametro ad una funzione, il compilatore crea una copia di quella variabile, quindi il contenuto dell'originale non viene toccato.

Questo fenomeno si chiama "Passaggio per valore", cioè alla funzione tu passi il "valore" della x, che viene "copiato" in una nuova variabile temporanea. Questa variabile temporanea esiste finchè esiste la funzione. Dopo il return, vengono distrutte automaticamente (per semplificare) tutte le variabili temporanee (o variabili locali) di una funzione.

PM Quote
Pagine: [ 1 2 3 ] Precedente | Prossimo