Follow along with the video below to see how to install our site as a web app on your home screen.
Nota: This feature may not be available in some browsers.
/* fattoriale.c */
#include "stdafx.h" /* header standard di Visual Studio, voi se usate altri IDE includete stdio.h */
#include <conio.h> /* header per la funzione getch(); portabile su linux */
int main() /* il programma inizia dalla funzione main() */
{
int numero; /* numero del quale calcolare il fattoriale */
int fattoriale = 1; /* il fattoriale è dato da n * (n - 1) * (n - 2) * ... * 1 per cui assegno a "fattoriale" il valore 1 */
printf("Inserisci il numero del quale calcolare il fattoriale : "); /* stampo a schermo la stringa tra virgolette */
scanf("%d", &numero); /* faccio scegliere il numero all'utente */
for(int contatore = numero; contatore >= 1; contatore--) /* inizio ciclo for */
fattoriale *= contatore; /* fine ciclo for - calcolo del fattoriale ( che equivale a scrivere fattoriale = fattoriale * contatore ) */
printf("%d! = %d", numero, fattoriale); /* stampo il fattoriale a schermo */
getch(); /* verrà chiesto all'utente di premere un tasto per chiudere il programma */
return 0;
} /* fine funzione main() - fine programma */
/* fattoriale.c */
#include "stdafx.h" /* header standard di Visual Studio, voi se usate altri IDE includete stdio.h */
#include <conio.h> /* header per la funzione getch(); portabile su linux */
long Fattoriale(long numero); /* prototipo della funzione Fattoriale */
int main() /* il programma inizia dalla funzione main() */
{
int numero; /* numero del quale calcolare il fattoriale */
printf("Scrivi il numero del quale calcolare il fattoriale : "); /* stampo a schermo la stringa tra virgolette */
scanf("%ld", &numero); /* faccio scegliere il numero all'utente */
printf("%d! = %ld", numero, Fattoriale(numero)); /* stampo a schermo il risultato */
getch(); /* verrà chiesto all'utente di premere un tasto per chiudere il programma */
return 0;
} /* fine funzione main() - fine programma */
long Fattoriale(long numero) /* funzione vera e propria */
{ /* inizio funzione Fattoriale */
if( numero <= 1 ) /* inizio istruzione if - verifico che il numero inserito dall'utente sia <= 1, se lo è restituisce 1 in quanto fattoriale di 1 = 1 */
return 1;
else /* altrimenti restituisco la moltiplicazione tra il numero scelto e il fattoriale del numero - 1 */
return ( numero * Fattoriale(numero - 1)); /* restituisco il fattoriale */
} /* fine funzione Fattoriale */
Belle chiacchiere...la guida quando la posti?
Secondo me è un po' troppo prolissa: una funzione ricorsiva è semplicemente una funzione che può auto-richiamarsi. Se si spiegano le funzioni ricorsive bisogna partire dal presupposto che il lettore abbia già una conoscenza minima del linguaggio, secondo me è controproducente spiegare il ciclo for e le funzioni.
Comunque sia per richiamare una funzione ci vuole "molto" (relativamente) tempo, quindi solitamente è preferibile usare i cicli piuttosto che le funzioni ricorsive... amenoché la performance non sia un problema.
La spiegazione del ciclo for è una questione di logica, io non scrivo guide e "le butto lì" senza far capire al lettore una mazza di quello che ha letto. Ci sono due tipi di lettori :
- quelli che hanno le conoscenze per comprendere perfettamente quanto scritto
- e quelli che non ne hanno
ora i primi sono sicuramente avvantaggiati rispetto ai secondi, ovviamente, ma i secondi nel caso in cui non avessero le conoscenze del linguaggio ( ma per esempio conoscono il ciclo for in un altro linguaggio ) attraverso quella spiegazione riescono a capire un po' come funzionano le cose. A me non sembra che sia controproducente, anzi il contrario, dove lo trovi un tipo che ti spiega le cose dall'abc ?
Va bene spiegare anche le basi, ma mi sembra confusionario parlarne in quest'ordine. Sarebbe meglio iniziare dal for, passare alle funzioni e poi parlare delle funzioni ricorsive; ancora meglio sarebbe fare delle guide distinte (o una divisione in capitoli), in questo modo se voglio leggere una guida sulle funzioni ricorsive non mi devo leggere i capitoli precedenti.
Inoltre qui prima usi il ciclo for e poi ne spieghi il funzionamento.
Comunque ogni guida è ben accetta, per avere un parere più oggettivo dovrai aspettare una risposta da chi non conosce l'argomento
PS.
Prima mi son dimenticato di segnalarti che stdafx.h non è l'header standard di visual studio, è un header precompilato. Se crei un progetto vuoto (come sarebbe meglio fare) puoi non metterlo.
Scusa ma non hai parlato dello stack e del sistema LIFO, non sarebbe fondamentale parlare di queste cose se vuoi spiegare le funzioni ricorsive??
...la funzione ricorsiva del fattoriale se io gli passo un numero=5 non parte da 1! ma si carica la sequenza nello stack il 5*4*3*2*1 e poi fa effetivamente 1*2*3*4*5 e hai il fattoriale di 5, o sbaglio??
Questo però è un parolone, programmare in C senza sapere quello che succede in memoria non è una delle scelte miglioriNon credo sia fondamentale, a te non interessa sapere cosa succede in memoria.
Da buon nabbo quale mi ritengo chiedo conferma......forse non sono stato chiarissimo con il mio commento ma intendevo questo,che peraltro rispetta chiaramente il sistema LIFO(preso dal Deitel):Con questa frase stai chiedendo conferma o ne sei assolutamente sicuro ?
Questo però è un parolone, programmare in C senza sapere quello che succede in memoria non è una delle scelte migliori
Da buon nabbo quale mi ritengo chiedo conferma......forse non sono stato chiarissimo con il mio commento ma intendevo questo,che peraltro rispetta chiaramente il sistema LIFO(preso dal Deitel):
Dal tuo commento sembra che parte subito da 1! come se gli fosse stato passato il parametro uno...in realtà secondo me ti sei mangiato tutto il primo pezzo delle chiamate(che magari hai dato per scontato conoscendo l'argomento), perchè il parametro che passiamo è un 5...per me il sistema LIFO è quanto di più chiaro ci possa essere per chi approccia alla ricorsione...
Questa è la spiegazione che ho fornito nel commentare il calcolo del fattoriale tramite ciclo for, il disegno da te fornito rispecchia la mia spiegazione.
int0x80
Si ma l'immagine che ti ho postato io è solo la ricorsiva...è su questo che volevo farti ragionare....da come commenti nel tuo post sembri saltare tutta la prima fase delle chiamate che una funzione ricorsiva dovrebbe compiere...cosa c'entra l'iterazione con quello che ti ho postato?
Forse volevi spiegare che la squenza in cui si chiama è come in un ciclo for??
Forse è un problema mio, magari non ti capisco.
Se ragioni da un punto di vista "logico" ti accorgi che in realtà una funzione ricorsiva ( essendo una funzione che richiama se stessa ) è come se fosse un ciclo for che viene eseguito in determinate condizioni, apposta quando si parla di funzioni ricorsive bisogna parlare dei "problemi" che riguardano la programmazione ( se non capisci a cosa mi riferisco parlo di quanto scritto al dodicesimo rigo ).
Non volevo spiegarlo, volevo che il lettore ( avendo un minimo di conoscenza del linguaggio e dell'argomento ) capisse da solo.
int0x80
Bene allora non mi sbagliavo ed era qui che volevo arrivare....se la guida è rivolta a dei novizi che non conoscono minimamente l'argomento ti puoi benissimo rendere conto che non lo capiranno mai....dovresti a mio parere (essendo una guida) spiegarlo...altrimenti è facile incorrere nell'errore...mio conosiglio è questo: mostra come è stato fatto nel deitel le due fasi della ricorsione e come funziona in se e per se(io parlerei proprio del LIFO) poi poni una domanda mostrandogli un fattoriale iterativo e trai(tu scrittore) le conclusioni...in fase di apprendimento cercherei di non far supporre nulla ai tuoi lettori perchè si potrebbero facilmente sbagliare...
se poi è una guida per chi sa già le cose(e allora è più una riflessione su alcuni concetti e non più una guida), ci può anche stare, ma rischi di essere frainteso dai non esperti del linguaggio come è successo con me
Ma guarda era un consiglio alla fine a me non importa xD io queste cose già le sapevoLa "guida" ( non so come definirla, non tutto è una "guida", ad esempio quello che ho scritto lo definirei più un'informazione ) che ho scritto è indirizzata a chi conosce ( anche in parte ) il linguaggio e vuole capire cos'è una funzione ricorsiva, nient'altro...se poi il lettore chiede un approfondimento ( come te ad esempio, mi chiedi di spiegare la struttura LIFO di una funzione ricorsiva in un post che spiega solo COS'E' e come essa opera ) allora è un altro discorso. Comunque se ci tieni non è un problema per me scrivere in 2 minuti quello che chiedi