Go Down

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

Flaviano8

l'esempio di lorenzo è molto chiaro.

lorenzo_soligo

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... :) poi alla fine come hai detto viene spesso usato come esempio per la sua semplicità, quindi non mi sembrava "grave" mettere anche quell'opzione :D

astrobeed

bè...di certo non volevo che mi dessi la pappa pronta!! :D
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:

Code: [Select]

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

PaoloP

#18
Dec 15, 2014, 06:17 pm Last Edit: Dec 15, 2014, 06:17 pm by PaoloP
Anche cosi funziona...
Code: [Select]
void setup (){
  Serial.begin(9600);
  unsigned long int a = 1;
  byte i = 2;
  for(; i < 6; i++, a*=i);
  Serial.println(i);
}

void loop () {}

lorenzo_soligo

Anche cosi funziona...
Code: [Select]
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'...

gpb01

#20
Dec 15, 2014, 10:46 pm Last Edit: Dec 15, 2014, 10:50 pm by gpb01
ciao, mi spiegheresti quando si può usare quella struttura for? il ; all'inizio e l' a*=i dentro la parentesi mi fregano un po'...
Copio e incollo dal Kernighan & Ritchie (... la Bibbia :smiley-mr-green: ) :


Quote
.
es. : for (fahr = 0; fahr <= 300; fahr = fahr + 20) { ... }

The for statement is a loop, a generalization of the while. If you compare it to the earlier while, its operation should be clear. Within the parentheses, there are three parts, separated by semicolons. The first part, the initialization

fahr = 0

is done once, before the loop proper is entered. The second part is the test or condition that controls the loop:

fahr <= 300

This condition is evaluated; if it is true, the body of the loop is executed. Then the increment step

fahr = fahr + 20

is executed, and the condition re-evaluated. The loop terminates if the condition has become false.

As with the while, the body of the loop can be a single statement or a group of statements enclosed in braces. The initialization, condition and increment can be any expression.
... l'ultimo capoverso è quello chiave ... credo non ci sia altro da aggiungere !

Guglielmo
Search is Your friend ... or I am Your enemy !

PaoloP

Comunque io preferisco la versione di Astrobeed al posto della mia perché più leggibile.
Tanto il compilatore lo ottimizza ugualmente, che la si scriva in ostrogoto o meno.

nid69ita

#22
Dec 16, 2014, 10:56 am Last Edit: Dec 16, 2014, 11:05 am by nid69ita
for (fahr = 0; fahr <= 300; fahr = fahr + 20) { ... }
@Lorenzo, aggiungo solo, che potresti trovare (raramente) istruzioni for con delle virgole, esempio: for( fahr =0, y=0 ; fahr<=300 ; fahr=fahr+20, y++)
ovvero fa 2 inizializzazioni (fahr e y a zero) e anche 2 incrementi delle due variabili distinte.
In un ciclo del genere fahr va da 0 a 300 a passi di 20, y va da 0 a 15 a passi di 1.
I passi sono 300/20 visto che fahr va di 20 in 20 (cicla 16 volte)
A ogni giro  fahr=>0,20,40,60,80     mentre y=>0,1,2,3,4...
my name is IGOR, not AIGOR

lorenzo_soligo

Grazie mille ad entrambi... Di programmazione ho fatto poco-nulla e più che C e simili mi è sempre piaciuto da morire il Python (pulito, ordinato, veloce, molto alla "pensa, traduci in inglese e scrivi"). Mi sa che prima o poi quel K&R lo dovrò pur comprare :D

gpb01

.. più che C e simili mi è sempre piaciuto da morire il Python (pulito, ordinato, veloce, molto alla "pensa, traduci in inglese e scrivi").
 ... fa che non ti senta Astrobeed che ti fa fare la fine di "Giordano Bruno" ... ERETICO !!!
Guglielmo
Search is Your friend ... or I am Your enemy !

Martinix

#25
Dec 16, 2014, 04:19 pm Last Edit: Dec 16, 2014, 04:19 pm by Martinix
... fa che non ti senta Astrobeed che ti fa fare la fine di "Giordano Bruno" ... ERETICO !!!
Guglielmo
anche io son un pò Pythoniano (per le interfaccine sul pc è una mano santa).. ora vado in piazza dei Fiori
ahahah  :smiley-evil:
Le informazioni date, son suggerimenti, osservazioni, ma come le applicate è a vostro rischio e pericolo!

gpb01

#26
Dec 16, 2014, 04:21 pm Last Edit: Dec 16, 2014, 04:21 pm by gpb01
anche io son un pò Pythoniano (per le interfaccine sul pc è una mano santa).. ora vado in piazza dei Fiori
... arrivo con la legna ... stasera arrosto  :D :D :D

Guglielmo
Search is Your friend ... or I am Your enemy !

astrobeed

Stasera vi farà visita questo simpatico signore  :D

Scientia potentia est

leo72

Volendo rendere il codice di Astro più compatto ma meno leggibile (in puro stile Python), si potrebbe fare così:
Code: [Select]
byte i = 5;
unsigned long int a;
while (i) a*=i--;


Non l'ho provato ma dovrebbe funzionare

leo72

PS: a me il Python proprio non piace  ;)

Go Up