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