Calcolo del fattoriale di un numero naturale
Si definisce fattoriale di un
numero naturale n, e si indica con n! (leggi: n fattoriale), il
prodotto
. La definizione può essere
riscritta in maniera ricorsiva (utile per la sua
traduzione immediata in linguaggio informatico) nel seguente
modo:
. (Attenzione: in una definizione ricorsiva
ci deve essere un punto di partenza!!).
In questa pagina proponiamo prima una implementazione elementare
basata su un algoritmo iterativo; successivamente
proponiamo una implementazione basata su un algoritmo ricorsivo,
come nella definzione che abbiamo dato sopra.
Abbiamo anche proposto vari tipi di visualizzazione
dell'output, per mostrare le capacità di Javascript
di gestire nuove finestre e frame. Nella specifica di xhtml 1.1
i frame sono deprecati e anche noi ne sconsigliamo l'uso:
abbiamo mantenuto l'implementazione del codice in una pagina
a frame solo per scopi didattici.
Il succo del programma con l'algoritmo iterativo è
costituito da una funzione che può apparire (ma non
è la sola possibilità!) così:
function fattoriale() {
document.write("<h3>I fattoriali dei numeri da 1 a
10<h3>");
for(i=1, fatt=1; i<11; i=i+1, fatt=fatt*i) {
document.write(i + "! = "+
fatt);
document.write("<br
/>");
}
}
Nella implementazione del nostro codice abbiamo seguito una via
leggermente diversa solo dal punto di vista della scrittura dei
dati nella pagina, senza l'uso di document.write, ma la
sostanza è esattamente quella
Commenti:
-
Le istruzioni sono separate dal punto e virgola, che è
opportuno mettere sempre, anche se a rigore è
considerato opzionale (tranne in certi casi...!).
-
La function è costituita da un nome seguito
obbligatoriamente dalla coppia di parentesi () che può
contenere oppure no dei parametri (le variabili o
argomenti); il codice vero e proprio della funzione
è racchiuso tra una coppia di parentesi graffe {}, che
indicano l'inizio e la fine della funzione stessa; la
stessa coppia di parentesi graffe racchiude sempre le
istruzioni complesse (in questo esempio un'altra coppia
è nel for).
-
E' molto importante ricordare che la funzione, il cui
codice viene caricato in memoria all'atto del caricamento
della pagina, non viene eseguita fin quando un evento non la
chiama. Nelle implementazioni di questo algortimo proponiamo
un esempio in cui l'evento è il caricamento stesso
della pagina (evento onload), altri in cui
l'evento è il click del mouse su un bottone
(evento onclick).
-
document.write è un metodo
(funzione incorporata) dell'oggetto
document. In pratica si può pensare ad esso
come ad una funzione predefinita che consente di scrivere
(con le regole dell'HTML e quindi inserendo anche
eventuali tag di formattazione -come in questo caso il tag
<h3> o il tag<br>) qualsiasi cosa in un
documento.
La funzione document.write ha una particolarità: se
essa è richiamata nel corpo della pagina, viene
eseguita all'atto del caricamento e quindi il suo
contenuto viene scritto sulla stessa pagina; se invece viene
azionata per esempio dal gestore onclick di eventi,
essa produce l'input in una nuova pagina vuota. Si tratta
dunque di un metodo potente, ma il cui uso deve essere
attentamente valutato.
-
for è un'istruzione fondamentale in js
come in ogni altro linguaggio di programmazione e fornisce un
costrutto per l'esecuzione di cicli. Deve contenere una
variabile che conta il numero di cicli: la variabile viene
inizializzata, incrementata alla fine del ciclo e ci deve
essere un test che consente di uscire dal ciclo. In js
l'istruzione for ha una sintassi che rende
estremamente semplice ed efficace il controllo di queste tre
operazioni, collocandole su un'unica riga appena dopo la
parola chiave stessa: for (inizializza; test;
incrementa). Nel nostro caso la variabile è
i, inizializzata ad 1, con test per
controllare che sia al massimo 10, e incrementata di
un'unità ogni ciclo. Come mostra l'esempio, la
sintassi di for consente anche altre istruzioni,
separate da una virgola, oltre alle tre obbligatorie. Si
tratta di un modo per rendere compatto un codice. La
scrittura estesa di questa istruzione, in questo caso,
sarebbe:
fatt=1;
for(i=1; i<11; i=i+1) {
fatt=fatt*i
document.write(i + "! = "+
fatt);
document.write("<br>");
}
-
i, fatt sono variabili, cioè
contenitori di valori. Javascript è molto poco
esigente in fatto di variabili. Anche se è bene
dichiararle prima di usarle (con la parola chiave
var: per esempio var i; dichiara la
variabile i), la cosa non è obbligatoria (nel
nostro esempio non abbiamo dichiarato le variabili i
e fatt) e la variabile si ritiene dichiarata la
prima volta che si usa. Inoltre non richiede una
dichiarazione di tipo: ad una variabile viene assegnato il
tipo che contiene. Se per esempio dichiaro var i; la
variabile i non avrà un tipo e
conterrà un valore indefinito; se poi dichiaro
i=10; allora la variabile sarà adatta a
contenere interi, se invece dichiaro
i="buongiorno"; allora la variabile
sarà adatta a contenere stringhe. E' anche
consentito cambiare tipo di variabile nel corso del programma
(ma è bene evitarlo!).
-
Nelle versioni più elaborate abbiamo introdotto la
funzione parseInt() che trasforma l'input della
casella di testo da stringa a numero.
-
+ è l'operatore di addizione tra numeri o di
concatenazione tra stringhe.
-
= è l'operatore di assegnazione. In una
espressione del tipo sinistra=destra viene assegnato
all'oggetto sinistra il valore, magari ottenuto
con il calcolo di un'espressione, dell'oggetto
destra. La situazione più comune è
quella in cui sinistra è una variabile e
destra un valore (del tipo previsto per quella
variabile); si hanno però anche altri casi, come
quando sinistra è il valore di una casella di
testo, ecc.
-
return è un'istruzione (che abbiamo usato
nell'ultimo degli esempi di questa pagina) che ha la
funzione di specificare il valore restituito da una funzione.
Tutta la parte di codice eventualmente presente dopo
return non viene eseguita
Esercizi proposti:
-
Introdurre, tra gli input dell'utente, un primo ed un
ultimo intero tra cui calcolare il fattoriale.
-
Calcolare il fattoriale di un unico numero introdotto
dall'utente.
-
Introdurre un qualche tipo di formattazione nell'output.
copyright 2000 et seq. maddalena falanga & luciano battaia
pagina pubblicata il 01/11/2001 - ultimo aggiornamento il
01/09/2003