Go Down

Topic: Calcolo fattoriale (Read 10357 times) previous topic - next topic

Flaviano8

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...

nid69ita

#1
Dec 13, 2014, 12:23 pm Last Edit: Dec 13, 2014, 12:23 pm by nid69ita
Ti invitiamo a presentarti (dicci quali conoscenze hai di elettronica e di programmazione) qui: Presentazioni
e a leggere il regolamento: Regolamento
- qui una serie di schede by xxxPighi per i collegamenti elettronici vari: ABC - Arduino Basic Connections
- qui le pinout delle varie schede by xxxPighi: Pinout
- qui una serie di link generali utili: Link Utili

In che senso tutte le condizioni ?
Se fattoriale di 0 eviti il ciclo con un if.
my name is IGOR, not AIGOR

astrobeed

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.
Scientia potentia est

leo72

Se non ti serve velocità, puoi usare la BigNum, una libreria scritta da uno dei mod del forum.
http://www.gammon.com.au/forum/?id=11519
La capacità è limitata solo dalla memoria del micro.

Flaviano8

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 :(

astrobeed

#5
Dec 13, 2014, 01:47 pm Last Edit: Dec 13, 2014, 01:47 pm by astrobeed
per esempio:
 fattoriale di 5
5x4x3x2x1= risultato

non riesco a trovare istruzioni o a creare un ciclo per provarlo :(
Non capisco quale sia il problema, bastano due righe codice per il fattoriale.

Code: [Select]


byte i;
unsigned long int a;

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

Scientia potentia est

Martinix

#6
Dec 13, 2014, 01:54 pm Last Edit: Dec 13, 2014, 01:57 pm by Martinix
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  :smiley-red:
Le informazioni date, son suggerimenti, osservazioni, ma come le applicate è a vostro rischio e pericolo!

astrobeed

#7
Dec 13, 2014, 01:59 pm Last Edit: Dec 13, 2014, 02:00 pm by astrobeed
astro per curiosità mia... perchè usi "byte i" ? io avrei usato "int i"
avrei sbagliato o ce un altra questione? grazie  :smiley-red:
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 :)
Scientia potentia est

Martinix

 :D 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"  :smiley-roll-sweat:
Le informazioni date, son suggerimenti, osservazioni, ma come le applicate è a vostro rischio e pericolo!

astrobeed

#9
Dec 13, 2014, 02:08 pm Last Edit: Dec 13, 2014, 02:09 pm by astrobeed
Son lento su certe cose grazie per il chiarimento che in effetti a pensarci si potrebbe usare molto di più dal solito "int"  :smiley-roll-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 :)
Scientia potentia est

lorenzo_soligo

#10
Dec 13, 2014, 02:37 pm Last Edit: Dec 13, 2014, 02:49 pm by lorenzo_soligo
Sempre per calcolare il fattoriale, si può ricorrere ad un ragionamento ricorsivo.

Prendiamo 4!: è 4*3*2*1.
3*2*1 è 3!, quindi 4!=4*3! (il 4*3*2*1 di qua sopra).
Analogamente 2*1 è 2!, quindi puoi anche scrivere 4! come 4*3*2!.
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 3*fact(3-1)=3*fact(2)=3*2*fact(1)=3*2*1=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 ;)
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 :)

Flaviano8

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..

astrobeed

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 :)
Scientia potentia est

astrobeed

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.
Scientia potentia est

Flaviano8

#14
Dec 13, 2014, 02:58 pm Last Edit: Dec 13, 2014, 02:59 pm by Flaviano8
bè...di certo non volevo che mi dessi la pappa pronta!! :D

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 ()
{
  }

Go Up