Pitagora (Member)
Expert
Messaggi: 367
Iscritto: 12/06/2010
|
Codice sorgente - presumibilmente C++ |
#include <stdio.h> int fact (int); int main (void) { int x = 3; printf("%d! = %d (%d)\n", x, fact(x), x); fgetc(stdin); return 0; } int fact (int y) { if (y == 0 || y == 1) { return 1; /* è questo il vero valore che dovrà tornare quando y == ... però non è così Why? */ } else { return y * fact(y - 1); } }
|
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
|
|
lumo (Member)
Expert
Messaggi: 449
Iscritto: 18/04/2010
|
intanto, forse non sai cos'è il fattoriale
Codice sorgente - presumibilmente Plain Text |
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?
|
|
pierotofy (Admin)
Guru^2
Messaggi: 6230
Iscritto: 04/12/2003
|
3! = 3*2*1 = 6
La funzione è corretta.
|
|
Numa Pompilio (Ex-Member)
Pro
Messaggi: 66
Iscritto: 03/05/2010
|
Postato originariamente da hackersitiz:
l'esempio ricorsivo dei fibonacci
|
I fratelli Fibonacci?
Si vai a vederti l'esempio.....e poi svogli degli esercizi
|
ahi mamma
ma cmq, la funzione non è corretta?
ps. si scherza
Ultima modifica effettuata da Numa Pompilio il 17/12/2010 alle 20:16 |
|
hackersitiz (Normal User)
Pro
Messaggi: 120
Iscritto: 29/09/2010
|
??
|
|
hackersitiz (Normal User)
Pro
Messaggi: 120
Iscritto: 29/09/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++ |
if (y == 0 || y == 1) {
{
return 1;
}
|
e dal passo ricorsivo
Codice sorgente - presumibilmente C/C++ |
else
{
return n * fact(n - 1);
}
|
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...
|
|