Newsgroup: it.comp.lang.c++
Titolo: tipo e funzione ricorsiva(quello vero)

Ciao,
chiedo scusa per il post precedente incompleto, ma il ditpo è stato più
veloce del cervello :-))
Dicevo che ho questa funzione ricorsiva per calcolare il fattoriale:
int factr (long n)
{
 if (n==1) return n;
 else return(factr(n-1)*n);
}
ma se gli passo un n >= 8 inizia a dare i numeri (per 8 restituisce -25216)
Cosa dovrei cambiare per correggerne il comportamento?
Ciao

 Cosa dovrei cambiare per correggerne il comportamento?
usa unsigned long, ma il problema si ripeterà, in forma differente, per 
valori poco più grandi.. il fatto è che i fattoriali sono valori che 
crescono molto rapidamente e sforano il valore massimo che un long o chi 
per lui può rappresentare. Le soluzioni potrebbero essere quelle di 
usare classi che gestiscono numeri di grandezza arbitraria (ne trovi se 
cerchi con google).
-- 
"Siamo una generazione di uomini cresciuti dalle donne, mi chiedo se 
un'altra donna è veramente la risposta che ci serve"

 valori poco più grandi.. il fatto è che i fattoriali sono valori che
Io userei gli "unsigned long long", che usano 64 bit invece di 32.
Con questi arrivi fino a 18446744073709551615 :) 
ciao
-- 
bunker
+++++++++++[>++++++>++++++++++++++++++++++++++++++++
+>++++++++++<<<-]>.>++++++++++.>.<----------.>---------.<+++++++.

 Con questi arrivi fino a 18446744073709551615 :) 
qui si parla di c++ standard :)


 qui si parla di c++ standard :)
Azz... non sono standard?
Mi documento subito :(


 Mi documento subito :(
mi pare che i long long siano standard solo nell'ultima ratifica del 
C... di sicuro in quella c++ non ne fa menzione.


 
(11:57) bunker@syn:~/programmazione/fixedpoint$ make
g++    -c -o use_fixed.o use_fixed.cpp
g++    -c -o fixed.o fixed.cpp
g++ -g -Wall -ansi -pedantic -o use_fixed use_fixed.o fixed.o
Boh, g++ (GCC) non mi dice nulla di tutto cio'... e io i fixed point li ho
implementati grazie ai long long :)


 implementati grazie ai long long :)
beh, ma "-Wall -ansi -pedantic" devi metterlo quando compili i .o, 
credo, non quando fai il linking.


>
infatti:
int
main(int argc, char * argv[])
{
     long long a = argc;
     return 0;
}
compilato con "-Wall -pedantic" mi da:
"warning: ISO C++ does not support 'long long'"


 credo, non quando fai il linking.
 
fixed.cpp:68: error: ISO C++ does not support `long long'
:'(
avevi ragione :(


 "warning: ISO C++ does not support 'long long'"
Ma quindi in C e' standard e in C++ no? E la compatibilita'?


 Ma quindi in C e' standard e in C++ no? E la compatibilita'?
in C++ probabilmente lo diventerà, per quel che riguarda la 
compatibilità... non so che dire, mi sa che col passare del tempo le 
differenze tra C e C++ potrebbero aumentare e, sinceramente, non so 
neanche quanto grande sia l'interesse del comitato nell'averla.


 Cosa dovrei cambiare per correggerne il comportamento?
Guarda caso 8! e' il primo fattoriale a superare i 32768. Penso proprio 
che tu stia usando un orrido compilatore con gli interi a 16 bit quindi 
prova ad usare il long anche come valore di ritorno della tua funzione 
ricorsiva :)

 Io userei gli "unsigned long long", che usano 64 bit invece di 32.
da dove hai tirato fuori il numero 32... dubito che gli int a cui si
riferiva Domenico fossero a 32 bits...
Tommy

 ricorsiva :)
Credo che questa sia la sooluzione oltre a cambiare compilatore. :-))
Ciao
Domenico


Eheh, se stai programmando su un pc (e non e' detto) cambia compilatore 
visto che ce ne sono di ottimi aggratis :)