×

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

4) Tavola pitagorica

Realizzare un programma in Java che stampi la tavola pitagorica, utilizzando una funzione che stampa la tabellina di un numero passato in input.

Soluzione

5) Costo gita scolastica

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

6) Rette perpendicolari

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.