Calcolo Fattoriale iterativo e ricorsivo: fatto curioso...

di Anonimizzato12155 il
4 risposte
Salve a tutti, mi sto avvicinando al mondo del C e vorrei porre a voi esperti un piccolo problema.
Ho scritto un programmino che richiede un numero da tastiera e ne calcola il fattoriale prima attraverso il metodo di iterazione e successivamente attraverso la ricorsione.

Il programma funziona abbastanza bene, l'unico fatto curioso è che superato un certo numero i valori calcolati tra iterazione e ricorsione differiscono da una certa cifra in poi.
Vorrei capire a cosa è dovuto, allego sotto esempio errore e codice sorgente. Grazie a tutti

Esempio da terminale:

**** Calcolo Fattoriale ****

Inserisci il numero del quale calcolare il fattoriale: 56

Iterativo -> Il Fattoriale di 56 è:
710998587804863451797683179691464326875337907723689145398690766266220675072
Ricorsivo -> Il Fattoriale di 56 è:
710998587804863451748643322383755883407870802854879251522891114356345405440

Tutto Fatto!!!


#include <stdio.h>

long double fattorialeIterativo(int);
long double fattorialeRicorsivo(int);

main()
{
	int dim;
	system("clear");
	printf("**** Calcolo Fattoriale ****\n\n");
	printf("Inserisci il numero del quale calcolare il fattoriale:  ");
	scanf("%d", &dim);
	printf("\nIterativo -> Il Fattoriale di %d è:  %.0Lf", dim, fattorialeIterativo(dim));
	printf("\nRicorsivo -> Il Fattoriale di %d è:  %.0Lf", dim, fattorialeRicorsivo(dim));
	printf("\n\nTutto Fatto!!!\n\n\n");
	return 0;
}

long double fattorialeIterativo(int dim){
	long double fatt = 1;
	int i;
	if(dim != 0)
		for(i=dim; i>0; i--)
			fatt *= i;
	return fatt;
}

long double fattorialeRicorsivo(int dim){
	long double fatt = 1;
	if(dim == 0)
		return fatt;
	else
		fatt *= dim;
	return fatt * fattorialeRicorsivo(dim-1);
}
Se provate a compilare noterete che con valori bassi sino a 30 credo l'algoritmo funziona alla grande, poi comincia a sballare. Grazie ancora

4 Risposte

  • Con quale sistema fai le prove?
    Il tuo programma va in overflow. In nessun caso arriverai ad avere numeri uguali se usi double.
  • Ho usato long double (10 bit o sbaglio?) per potere calcolare numeri grossi.
    Con 56 non penso vada in overflow, e poi scusa se va in overflow non dovrebbero essere totalmente diversi i numeri? Mentre le prime 10 15 cifre sono uguali sempre...

    Come macchina uso ubuntu 12.04 a 64bit su core i5-2500K
  • Cioè 10 byte volevo dire
  • Appunto seiin 64bit.Prova in 32bit e ne parliamo.Cmq la precisione del double non è fissa per quello che hai dati diversi.
Devi accedere o registrarti per scrivere nel forum
4 risposte