![]() ![]() |
|
Molti algoritmi presentano una struttura
ricorsiva: per risolvere un determinato problema, tali algoritmi
richiamano se stessi per gestire sottoproblemi analoghi a quello di partenza.
Gli algoritmi ricorsivi generalmente sono organizzati nel seguente modo:
|
![]() ![]() |
|
Immaginiamo di dover calcolare il fattoriale di
un numero n:
n! = 1 * 2 * 3 * ... * nPer convenzione 0! = 1. Inoltre, il fattoriale non è definito per i numeri negativi. Come possiamo scrivere un metodo che calcoli la funzione fattoriale? Osserviamo che n! = 1*2*...*(n-1)*n = (n-1)! * nQuindi, un algoritmo per calcolare il fattoriale di n si può descrivere nel seguente modo: per calcolare il fattoriale di n, si calcola il fattoriale di n-1 e lo si moltiplica per n.Possiamo allora implementare il seguente metodo:
Un programma completo per il calcolo del fattoriale:
Fac.java
|
![]() ![]() |
|
In Java, un metodo può chiamare se stesso, purché la chiamata utilizzi un valore più semplice. Il meccanismo per cui un metodo chiama se stesso per un numero ripetuto di volte si chiama ricorsione. Esaminiamo il calcolo di 4! con il metodo factorial.
|
![]() ![]() |
|
Esistono due requisiti chiave per assicurarsi che la ricorsione riesca:
Il calcolatore ha bisogno di una certa quantità di memoria per gestire ciascuna chiamata ricorsiva. Dopo un certo numero di chiamate la memoria disponibile per questo scopo si esaurisce e il programma termina automaticamente segnalando un errore di stack.
|
![]() ![]() |
|
![]() ![]() |
Un metodo ricorsivo per determinare l'elemento minimo in un array di numeri interi:
Un programma completo che usa il metodo minRic: ArrayMinRic.java
|