[C] Calcolo del fattoriale non ricorsivo e ricorsivo

frab1
ciao,
vi propongo 2 versioni di un programma in codice c per calcolare il fattoriale di un numero...In entrambi ho lo stesso problema: stampare il risultato corretto che mi è restituito dalla fiunzione "fatt".

VERSIONE NON RICORSIVA:
#include <stdio.h>
int fatt (int n)
{
	int t,result;
	
	result=1;
	for(t=2;t<n;t++)
		result *= t;
	return result;
}

int main(void)
{
	int n;
	int result;
	printf("\nInserire numero di cui calcolare il fattoriale:\n");
	scanf("%d",&n);
	int fatt(int n);
	fatt(n);
	printf("Il fattoriale vale:%d\n",result);
}


VERSIONE CON FUNZIONE RICORSIVA:

#include <stdio.h>

int fatt(int n)
{
	if(n==1){
		return 1;
		printf("Il fattoriale vale 1");
	}
	else { 
//		return(n*fatt(n-1));
		printf("Il fattoriale vale %d\n",n*fatt(n-1));
	}
}

int main(void)
{
	int n;
	printf("Immetti valore:\n");
	scanf("%d\n",&n);
	int fatt(int n);
	fatt(n);
}


credo che il passaggio dell'argomento alla funzione sia giusto, ho dubbi sul valore ritornato e sulla sua stampa...
Dove sbaglio?

Risposte
apatriarca
Che numero hai richiesto di stampare? Stai usando degli int per cui si fa abbastanza in fretta ad uscire dai valori rappresentabili.. Nel primo codice c'è un errore nella condizione di terminazione di ciclo, devi moltiplicare anche per n per cui dovrebbe essere t <= n. Il secondo dovrebbe essere invece corretto.

frab1
nel primo, che formalmente mi sembra corretto invece che stamparmi (se inserisco n=4) 12, mi stampa -1217204236...
il secondo invece non stampa proprio nulla.. :-(

apatriarca
Stai stampando result, ma non l'hai inizializzato. Probabilmente volevi scrivere: result = fatt(n) nel primo codice. Devi poi fare la correzione che ti ho già detto nel primo precedente post: usare <= al posto di <..

Nel secondo codice invece hai messo '\n' nello scanf e non fa quello che pensi tu. Toglilo. Dopodiché non restituisci alcun risultato.. Nel caso generale. Infine il codice
return 1;
printf("Il fattoriale vale 1");

non ha senso. La seconda riga non verrà mai eseguita..

Se proprio vuoi stampare anche tutti i valori intermedi, puoi fare qualcosa come segue:
#include <stdio.h>

int fatt(int n)
{
   if(n==1){
      printf("Il fattoriale vale 1");
      return 1;
   }
   else { 
      int ret = n*fatt(n-1);
      printf("Il fattoriale vale %d\n", ret);
      return ret;
   }
}

int main(void)
{
   int n;
   printf("Immetti valore:\n");
   scanf("%d",&n);
   int fatt(int n);
   fatt(n);
}

frab1
grazie,sisi la condizione l'avevo già corretta ma non ho aggiornato il thread, avevo anche levato il \n nella scanf, ho provato la tua versione per il secondo e funziona!Grazie

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.