Esercizi sulle funzioni in Java
Questa sezione contiene una raccolta dei principali esercizi sulle funzioni svolti a lezione, o
assegnati
per lo svolgimento a casa, o in laboratorio.
L'elenco sarà aggiornato sulla base delle esigenze didattiche e/o delle
osservazioni/considerazioni
che
emergeranno durante l'interazione con gli allievi.
Nota:
Attenzione, la
numerazione degli esercizi non è definitiva e può cambiare nel tempo, man mano che vengono
inseriti nuovi esercizi, o riorganizzati quelli esistenti.
Fare riferimento al titolo per
individuare, nel tempo, esercizi specifici.
1) Maggiore tra due numeri interi
Realizzare un programma in Java che chieda all'utente di inserire due numeri interi
e stampi il maggiore tra i due numeri inseriti, utilizzando le funzioni, ovunque
possibile.
Soluzione
2) Quoziente e resto della divisione
Realizzare un programma in Java che chieda all'utente di inserire due numeri interi positivi
(>0),
calcoli e stampi il risultato del quoziente e resto della divisione tra i due numeri
inseriti dall'utente, utilizzando le funzioni, ovunque possibile.
Se i numeri inseriti non
fossero
corretti, il programma deve visualizzare un messaggio di errore e chiedere nuovamente il
numero.
Inoltre i valori del quoziente e resto devono essere calcolati con l'algoritmo delle sottrazioni
successive.
Soluzione
3) Potenza tra due numeri
Realizzare un programma in Java che chieda all'utente di inserire due numeri interi positivi
(>0),
calcoli e stampi il risultato del primo numero elevato al secondo e, successivamente, del
secondo
elevato al primo.
Utilizzare le funzioni, sia per la lettura dei numeri, che per il calcolo della potenza.
Se i
numeri
inseriti non fossero
corretti, il programma deve visualizzare un messaggio di errore e chiedere nuovamente il
numero.
Inoltre, il valore della potenza deve essere calcolato moltiplicando la base per sé stessa un
numero
di
volte pari al valore dell'esponente.
Soluzione
Realizzare un programma in Java che stampi la tavola pitagorica, utilizzando una funzione che
stampa
la
tabellina di un numero passato in input.
Soluzione
In un albergo il prezzo al giorno della camera dipende dal piano in cui si trova secondo la
seguente
tabella:
- piano 1: € 35
- piano 2: € 45
- piano 3: € 55
- piano 4: € 65
Scrivere un programma Java che chieda all'utente di inserire il numero di giorni di permanenza
ed il
piano desiderato
della camera e calcoli il preventivo del costo totale, sapendo, inoltre, che l'albergo applica
uno
sconto del 5% per le
permanenze superiori a 7 giorni.
Analizzare il problema ed individuare le funzioni con maggior senso logico.
Soluzione
Realizzare, utilizzando le funzioni, un programma in Java per la verifica della perpendicolarità
tra due rette del piano cartesiano.
Il programma deve acquisire i dati dei coefficienti angolari e delle quote delle due rette e
stampare un
messaggio sulla condizione di perpendicolarità delle rette.
Tale messaggio deve anche
visualizzare
l'equazione di ciascuna retta nella forma y = m * x + q.
Soluzione
7) Somma dei primi N numeri interi
Realizzare un programma Java che chieda all'utente di inserire un numero intero positivo N
(>0), calcoli e stampi la somma dei primi N numeri interi.
Implementare due funzioni
per il calcolo della somma, una in versione iterativa,
l'altra in versione ricorsiva dell'algoritmo. Eseguire il calcolo utilizzando entrambe le
funzioni e stampare i risultati.
La definizione della funzione ricorsiva è la seguente:
$$s(n) =
\begin{cases} 1 & \text{se n = 1 (caso base)}
\\
\\ s(n-1)\ +\ n & \text{altrimenti (passo di avvicinamento}
\\ & \text{e chiamata ricorsiva)}
\end{cases}$$
Soluzione
8) Prodotto dei primi N numeri interi
Realizzare un programma Java che chieda all'utente di inserire un numero intero positivo N
(>0), calcoli e stampi il prodotto dei primi N numeri interi.
Implementare due funzioni
per il calcolo del prodotto, una in versione iterativa,
l'altra in versione ricorsiva dell'algoritmo. Eseguire il calcolo utilizzando entrambe le
funzioni e stampare i risultati.
La definizione della funzione ricorsiva è la seguente:
$$p(n) =
\begin{cases} 1 & \text{se n = 1 (caso base)}
\\
\\ p(n-1)\ *\ n & \text{altrimenti (passo di avvicinamento}
\\ & \text{e chiamata ricorsiva)}
\end{cases}$$
Soluzione
9) Fattoriale di un numero n positivo
Realizzare un programma Java che chieda all'utente di inserire un numero intero positivo n
(>=0), calcoli e stampi il suo fattoriale.
Implementare due funzioni
per il calcolo del fattoriale, una in versione iterativa,
l'altra in versione ricorsiva dell'algoritmo. Eseguire il calcolo utilizzando entrambe le
funzioni e stampare i risultati.
Esempio:
numero inserito = 8
Output:
40320
perchè fatt(8) = 8! = 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1
La definizione della funzione ricorsiva è la seguente:
$$fatt(n) =
\begin{cases} 1 & \text{se n = 0 (caso base)}
\\
\\ n\ *\ fatt(n-1) & \text{altrimenti (passo di avvicinamento}
\\ & \text{e chiamata ricorsiva)}
\end{cases}$$
10) Quoziente e resto della divisione
(ricorsivo)
Realizzare un programma in Java che chieda all'utente di inserire due numeri interi positivi
(>0),
calcoli e stampi il risultato del quoziente e resto della divisione tra i due numeri
inseriti dall'utente, utilizzando due funzioni ricorsive che calcolano i risultati utilizzando
l'agoritmo delle sottrazioni successive.
La definizione delle funzioni ricorsive sono le seguenti:
$$q(divd, divs) =
\begin{cases} 0 & \text{se divd < divs (caso base)}
\\
\\ 1+q(divd-divs, divs) & \text{altrimenti (passo di avvicinamento}
\\ & \text{e chiamata ricorsiva)}
\end{cases}$$
$$r(divd, divs)=
\begin{cases} divd & \text{se divd < divs (caso base)}
\\
\\ r(divd-divs, divs) & \text{altrimenti (passo di avvicinamento}
\\ & \text{e chiamata ricorsiva)}
\end{cases}$$
Soluzione
11) MCD Euclide - sottrazioni
Realizzare un programma Java che chieda all'utente di inserire due numeri interi
positivi
(>0), calcoli e stampi il MCD tra i due numeri, utilizzando l'algoritmo di Euclide
(sottrazioni
successive).
Implementare due funzioni per il calcolo del MCD, una in versione
iterativa,
l'altra in versione ricorsiva dell'algoritmo. Eseguire il calcolo utilizzando
entrambe le
funzioni e stampare i risultati.
La definizione della funzione ricorsiva è la seguente:
$$mcd(a,\ b) =
\begin{cases} b & \text{se a = b (caso base)}
\\
\\ mcd(a-b,\ b) & \text{se a > b (passo di avvicinamento}
\\ & \text{e chiamata ricorsiva)}
\\
\\ mcd(a,\ b-a) & \text{se a < b (passo di avvicinamento}
\\ & \text{e chiamata ricorsiva)}
\end{cases}$$
Soluzione
12) MCD Euclide -
divisioni
Realizzare un programma Java che chieda all'utente di inserire due numeri
interi positivi
(>0), calcoli e stampi il MCD tra i due numeri, utilizzando l'algoritmo di
Euclide
(divisioni
successive).
Implementare due funzioni per il calcolo del MCD, una in
versione
iterativa,
l'altra in versione ricorsiva dell'algoritmo. Eseguire il calcolo
utilizzando entrambe
le
funzioni e stampare i risultati.
La definizione della funzione ricorsiva, dati i numeri a e b, tali che a >= b, è la
seguente:
$$mcd(a,\ b) =
\begin{cases} b & \text{se a % b = 0 (caso base)}
\\
\\ mcd(b,\ a\ \%\ b) & \text{altrimenti (passo di avvicinamento}
\\ & \text{e chiamata ricorsiva)}
\end{cases}$$
Nota:
La funzione
richiede che i valori dei parametri passati in input siano tali da soddisfare la condizione
a >= b.
In caso contrario si possono ipotizzare due alternative: la prima prevede che sia
il chiamante a garantire il passaggio dei parametri in modo da rispettare la condizione, la
seconda potrebbe delegare alla funzione stessa il controllo della condizione e l'eventuale
scambio dei valori ricevuti in input, qualora essa non fosse soddisfatta.
Soluzione
13) Successione di
Fibonacci
Realizzare un programma Java che chieda all'utente di inserire un numero
intero positivo
N
(>0) e stampi la successione di Fibonacci, fino all'N-esimo
numero.
Implementare due
funzioni per il calcolo dei numeri, una in versione iterativa,
l'altra in versione ricorsiva. Eseguire il calcolo utilizzando entrambe le
funzioni e stampare i risultati.
La definizione della funzione ricorsiva è la seguente:
$$f(n) =
\begin{cases} 1 & \text{se n = 1 o 2 (caso base)}
\\
\\ f(n-2)\ +\ f(n-1) & \text{altrimenti}
\\ & \text{(passo di avvicinamento}
\\ & \text{e chiamata ricorsiva)}
\end{cases}$$
Soluzione
14) Stampa di una riga di asterischi
Anche un compito non prettamente matematico si può risolvere attraverso un approccio
ricorsivo.
Consideriamo, ad esempio, un problema che chieda di stampare una riga di asterischi composta da
un numero di caratteri (> 0) inserito dall'utente. Un'analisi adeguata potrebbe condurre alla
seguente soluzione ricorsiva:
$$riga(n) =
\begin{cases} * & \text{se n = 1 (caso base)}
\\
\\ * + riga(n-1) & \text{altrimenti}
\\ & \text{(passo di avvicinamento}
\\ & \text{e chiamata ricorsiva)}
\\ & \text{+ indica la concatenazione}
\\ & \text{di caratteri}
\end{cases}$$
In parole, possiamo concludere che la stampa di una riga composta da un solo asterisco
(caso base) è semplicemente realizzabile stampando il carattere asterisco.
In generale, invece, la stampa di una riga composta da n asterischi può essere ottenuta
stampando un asterisco e richiamando ricorsivamente la funzione con valore del parametro
diminuito di uno, per stampare i restanti n-1 asterischi.
Soluzione
15) Stampa numero rovesciato
Scrivere un programma Java che chieda all'utente di inserire un numero intero positivo e lo
stampi
al contrario, utilizzando una funzione ricorsiva.
Analizzare il problema e ricavare la
definizione della funzione ricorsiva.
Esempio:
numero inserito = 258796413
Output:
314697852
16) Filastrocca del re e della serva
Una filastrocca popolare racconta:
"C'era una volta un re, seduto su un sofà, che disse alla
sua serva: "Raccontami una storia! "
E la serva cominciò:
"C'era una volta un re, seduto su un sofà, che disse alla sua serva:
"Raccontami una storia!"
E la serva cominciò:
"C'era una volta un re, .....
Scrivere una funzione Java ricorsiva che stampi la filastrocca un numero specifico di volte
introdotto dall'utente.
17) Frase/parola palindroma
Scrivere una functione Java ricorsiva che determini se una data stringa ricevuta in input è
palindroma.
Un stringa è palindroma quando risulta uguale al suo rovesciamento.
Esempi:
AMA, ESSE, ACCA, RADAR, sono parole palindrome in
quanto sono uguali alla parola ottenuta rovesciandole.