Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Dubbio sulle ricorsioni
Forum - C/C++ - Dubbio sulle ricorsioni

Avatar
Pitagora (Member)
Expert


Messaggi: 367
Iscritto: 12/06/2010

Segnala al moderatore
Postato alle 18:17
Venerdì, 17/12/2010
Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2.  
  3. int fact (int);
  4.  
  5. int main (void) {
  6.     int x = 3;
  7.     printf("%d! = %d (%d)\n", x, fact(x), x);
  8.     fgetc(stdin);
  9.     return 0;
  10. }
  11.  
  12. int fact (int y) {
  13.     if (y == 0 || y == 1) {
  14.         return 1; /* è questo il vero valore che dovrà tornare quando y == ... però non è così Why? */
  15.     } else {
  16.         return y * fact(y - 1);
  17.     }
  18. }



Perchè fact(3) torna un valore uguale a 6 invece di un valore uguale ad 1 come è indicato nella 2° riga a partire dalla funzione fact :-?


Yep, I came back :P
PM
Avatar
lumo (Member)
Expert


Messaggi: 413
Iscritto: 18/04/2010

Up
1
Down
V
Segnala al moderatore
Postato alle 19:30
Venerdì, 17/12/2010
intanto, forse non sai cos'è il fattoriale
Codice sorgente - presumibilmente Plain Text

  1. fact( n ) = n! = 1*2*....*n


detto questo, pensiamo di aver chiamato fact(3)
3 non è ne 0 ne 1, quindi la funzione ritorna 3*fact(2)
2 è > 1, quindi ritorna 2*fact(1)
e fact(1) ritorna 1.
Tornando indietro, sostituiamo prima 1 a fact(1), quindi diventa fact(2)=2*1
sostituiamo fact(2) con 2*1 e troviamo fact(3)=3*2*1, capito?

PM
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6110
Iscritto: 04/12/2003

Up
1
Down
V
Segnala al moderatore
Postato alle 19:33
Venerdì, 17/12/2010
3! = 3*2*1 = 6

La funzione è corretta.


Seguimi su Twitter: http://www.twitter.com/pierotofy

Fai quello che ti piace, e fallo bene.
PM
Avatar
Numa Pompilio (Ex-Member)
Pro


Messaggi: 66
Iscritto: 03/05/2010

Up
-3
Down
V
Segnala al moderatore
Postato alle 20:15
Venerdì, 17/12/2010
Testo quotato

Postato originariamente da hackersitiz:
l'esempio ricorsivo dei fibonacci



I fratelli Fibonacci?

Testo quotato

Si vai a vederti l'esempio.....e poi svogli degli esercizi



ahi mamma

ma cmq, la funzione non è corretta?

ps. si scherza :k:


Ultima modifica effettuata da Numa Pompilio il 17/12/2010 alle 20:16


PM
Avatar
hackersitiz (Normal User)
Pro


Messaggi: 120
Iscritto: 29/09/2010

Up
-3
Down
V
Segnala al moderatore
Postato alle 20:16
Venerdì, 17/12/2010
??

Usa i commenti per continuare la discussione su una domanda - pierotofy - 17/12/10 20:32


Testo quotato


il punto di partenza è il codice che hai scritto, ma non lo vedo...
Fare o non fare, non esiste provare...
Impara bene le regole così che tu possa infrangerle

PM
Avatar
hackersitiz (Normal User)
Pro


Messaggi: 120
Iscritto: 29/09/2010

Up
-4
Down
V
Segnala al moderatore
Postato alle 19:48
Venerdì, 17/12/2010
Non credo tu abbia compreso bene la ricorsione...
Di solito le funzioni si richiamano in modo gerarchico...
La ricorsione è quando una funzione richiama se stessa fino a quando non si verifica il caso base...
Come ti ha spiegato la tua funzione fact fa ciò che deve fare quindi fa 3 * 2 * 1...
In effettii 3! = 3 * 2 * 1...
La ricorsione è composta dal caso base
Codice sorgente - presumibilmente C/C++

  1. if (y == 0 || y == 1) {
  2. {
  3.         return 1;
  4. }



e dal passo ricorsivo
Codice sorgente - presumibilmente C/C++

  1. else
  2. {
  3.     return n * fact(n - 1);
  4. }


Da quel che ho visto non hai capito bene la ricorsione...
Consiglio?
Si vai a vederti l'esempio ricorsivo dei fibonacci in modo da capirlo e poi svogli degli esercizi...
Te ne do uno(ammesso che tu voglia farlo)

una funzione che calcola i collegamenti tra vari punti...
Mi spiego meglio...
Allora una funzione che chiami come vuoi che riceva come parametro i punti e calcoli i suoi collegamenti..
Esempio:
punti = 3 --> collegamenti = 3
punti = 2 --> collegamenti = 1

Hai due possibilità:
o fai tutto in una funzione o fai una funzione che calcoli i numeri triangolari....
Saluti...


Testo quotato


il punto di partenza è il codice che hai scritto, ma non lo vedo...
Fare o non fare, non esiste provare...
Impara bene le regole così che tu possa infrangerle

PM