Calcolo fattoriale

Ciao a tutti,

Mi sono imbattuto nel calcolo del fattoriale... ho provato con un ciclo for, ma non riesco a fare la moltiplicazione di tutte le condizioni.... qualcuno può aiutarmi?
non riesco a capire...

Ti invitiamo a presentarti (dicci quali conoscenze hai di elettronica e di programmazione) qui: Presentazioni
e a leggere il regolamento: Regolamento

In che senso tutte le condizioni ?
Se fattoriale di 0 eviti il ciclo con un if.

Flaviano8:
Mi sono imbattuto nel calcolo del fattoriale... ho provato con un ciclo for, ma non riesco a fare la moltiplicazione di tutte le condizioni.... qualcuno può aiutarmi?

Intanto non dici nemmeno fino a che fattoriale vuoi arrivare, comunque con Arduino il massimo è 15! se usi gli unsigned long int, oltre non puoi andare perché al massimo puoi gestire valori a 32 bit.

Se non ti serve velocità, puoi usare la BigNum, una libreria scritta da uno dei mod del forum.

La capacità è limitata solo dalla memoria del micro.

Allora, non è tanto importante (per me) le dimensioni del fattoriale.. nel senso...sarei più per capire come calcolarlo. so cos'è un fattoriale a livello di teoria ma con arduino non riesco a calcolarlo... non riesco a trovare una soluzione.

per esempio:
fattoriale di 5
5x4x3x2x1= risultato

non riesco a trovare istruzioni o a creare un ciclo per provarlo :frowning:

Flaviano8:
per esempio:
fattoriale di 5
5x4x3x2x1= risultato

non riesco a trovare istruzioni o a creare un ciclo per provarlo :frowning:

Non capisco quale sia il problema, bastano due righe codice per il fattoriale.

byte i;
unsigned long int a;

// calcola 5!
a = 1;
for (i=2;i<6;i++) a *=I;

astro per curiosità mia... perchè usi "byte i" ? io avrei usato "int i"
avrei sbagliato o ce un altra questione, tipo tanto 5! < di 255? grazie :blush:

Martinix:
astro per curiosità mia... perchè usi "byte i" ? io avrei usato "int i"
avrei sbagliato o ce un altra questione? grazie :blush:

Per il semplice motivo che non ha senso usare un valore a 16 bit quando al massimo puoi calcolare 15! che definisci senza problemi in 8 bit :slight_smile:

:smiley: grazie.. ci ero arrivato dopo!
Son lento su certe cose grazie per il chiarimento che in effetti a pensarci si potrebbe usare molto di più dal solito "int" :cold_sweat:

Martinix:
Son lento su certe cose grazie per il chiarimento che in effetti a pensarci si potrebbe usare molto di più dal solito "int" :cold_sweat:

Purtroppo in Arduino gli int sono abusati, basta guardare gli esempi ufficiali dove i pin vengono definiti come int, un vero spreco di preziosa ram, poi si lamentano che lo sketch si pianta perché è andato in ram overflow :slight_smile:

Sempre per calcolare il fattoriale, si può ricorrere ad un ragionamento ricorsivo.

Prendiamo 4!: è 4321.
3
21 è 3!, quindi 4!=43! (il 4321 di qua sopra).
Analogamente 2
1 è 2!, quindi puoi anche scrivere 4! come 432!.
secondo questo ragionamento, puoi fare una funzione che:

se il numero è 1 o 0, restituisce 1
se il numero (chiamiamolo n) è maggiore o uguale a 2, restituisce n*fattoriale(n-1).

Esempio con n=3: la funzione ci restituisce 3fact(3-1)=3fact(2)=32fact(1)=321=6.

Il fatto che la funzione richiami se stessa la rende ricorsiva. Un esempio di funzione ricorsiva che fa "impazzire" il pc (il termine tecnico è stack overflow) con veramente poco è quella di Ackermann, ce la presentò il professore anni fa ed effettivamente è molto curiosa. Dacci un'occhiata :wink:
Questa è un' "analisi logica" del problema, implementabile tranquillamente via software. Altrimenti vedo che hai già ricevuto numerosi consigli, il più semplice dei quali è un semplicissimo ciclo da 1 a n :slight_smile:

Uhm... ho provato ad eseguire lo sketch segnalato da astrobeed ma sulla seriale mi stampa sempre 0.. non capisco.
In più io vorrei eseguire uno ciclo che cambiando il numero mi esegui automaticamente il fattoriale...
cioè: se scrivo 5 mi faccia il suo fattoriale, ma se scrivo 6 7 o 8 mi esegua il ciclo in automatico, senza dover cambiare all'interno dell'istruzione for..

Flaviano8:
Uhm... ho provato ad eseguire lo sketch segnalato da astrobeed ma sulla seriale mi stampa sempre 0.. non capisco.

Se stampa zero è perché hai sbagliato qualcosa, posta lo sketch e vediamo dove sta l'errore, se te lo scrivo io non impari nulla :slight_smile:

lorenzo_soligo:
Sempre per calcolare il fattoriale, si può ricorrere ad un ragionamento ricorsivo.

Si, infatti uno degli esempi più gettonati per dimostrare la recursività del C è proprio il calcolo del fattoriale, però ho preferito usare un normale ciclo for visto che stiamo parlando ad un principiante e non è il caso di confondergli le idee più di tanto.

bè...di certo non volevo che mi dessi la pappa pronta!! :smiley:

byte i;
unsigned long int a;
int I;

void setup (){
Serial.begin(9600);
a=1;
for (i=2;i<6;i++) a*=I;
Serial.println (I);
}
void loop ()
{
}

l'esempio di lorenzo è molto chiaro.

astrobeed:
Si, infatti uno degli esempi più gettonati per dimostrare la recursività del C è proprio il calcolo del fattoriale, però ho preferito usare un normale ciclo for visto che stiamo parlando ad un principiante e non è il caso di confondergli le idee più di tanto.

L'ho scritto apposta molto "terra-terra", proprio per cercare di renderlo il più facile possibile... :slight_smile: poi alla fine come hai detto viene spesso usato come esempio per la sua semplicità, quindi non mi sembrava "grave" mettere anche quell'opzione :smiley:

Flaviano8:
bè...di certo non volevo che mi dessi la pappa pronta!! :smiley:

Ci sono diversi errori, prima di tutto I non serve a nulla, se stampi lui è ovvio che rimane a 0 visto che non viene mai cambiato, devi stampare a che contiene il fattoriale, inoltre devi inserire la print nel ciclo for se vuoi vedere anche i risultati intermedi.

Ecco lo sketch corretto:

byte i;
unsigned long int a;



void setup (){
  Serial.begin(9600);
  a=1;
for (i=2;i<6;i++) 
{
 a*=i; 
 Serial.println (i);
}
}
void loop ()
{ 
  }
[/quote]

Anche cosi funziona...

void setup (){
  Serial.begin(9600);
  unsigned long int a = 1;
  byte i = 2;
  for(; i < 6; i++, a*=i);
  Serial.println(i);
}

void loop () {}

PaoloP:
Anche cosi funziona...

void setup (){

Serial.begin(9600);
  unsigned long int a = 1;
  byte i = 2;
  for(; i < 6; i++, a*=i);
  Serial.println(i);
}

void loop () {}

ciao, mi spiegheresti quando si può usare quella struttura for? il ; all'inizio e l' a*=i dentro la parentesi mi fregano un po'...